python-17-并行计算和分布式计算框架dask

article/2025/10/20 7:33:44

dask入门教程
并行计算库Dask官方教程(中文翻译)
dask和numpy的计算对比

1 并行计算和分布式计算

1.1 并行计算parallel computing

并行计算:这是一台计算机的概念,即一台计算机中多个处理器被组织起来,大任务下达的时候,将大任务分成若干个小任务,然后分配给若干个处理器进行运算。

并行计算(Parallel Computing)是指同时使用多种计算资源解决计算问题的过程,是提高计算机系统计算速度和处理能力的一种有效手段。它的基本思想是用多个处理器来协同求解同一问题,即将被求解的问题分解成若干个部分,各部分均由一个独立的处理器来并行计算。并行计算系统既可以是专门设计的、含有多个处理器的超级计算机,也可以是以某种方式互连的若干台的独立计算机构成的集群。通过并行计算集群完成数据的处理,再将处理的结果返回给用户。

并行计算可分为时间上的并行和空间上的并行。

时间上的并行:是指流水线技术,比如说工厂生产食品的时候步骤分为:
1. 清洗:将食品冲洗干净。
2. 消毒:将食品进行消毒处理。
3. 切割:将食品切成小块。
4. 包装:将食品装入包装袋。

如果不采用流水线,一个食品完成上述四个步骤后,下一个食品才进行处理,耗时且影响效率。但是采用流水线技术,就可以同时处理四个食品。这就是并行算法中的时间并行,在同一时间启动两个或两个以上的操作,大大提高计算性能。

空间上的并行:是指多个处理机并发的执行计算,即通过网络将两个以上的处理机连接起来,达到同时计算同一个任务的不同部分,或者单个处理机无法解决的大型问题。

比如小李准备在植树节种三棵树,如果小李1个人需要6个小时才能完成任务,植树节当天他叫来了好朋友小红、小王,三个人同时开始挖坑植树,2个小时后每个人都完成了一颗植树任务,这就是并行算法中的空间并行,将一个大任务分割成多个相同的子任务,来加快问题解决速度。

1.2 分布式计算distributed computing

分布式计算:这个一组计算机的概念,通过计算机网络连接起来,大任务下达的时候,将大任务分成若干个小任务,然后分配给若干个计算机进行运算。
在这里插入图片描述
研究如何把一个需要非常巨大的计算能力才能解决的问题分成许多小的部分,然后把这些部分分配给许多计算机进行处理,最后把这些计算结果综合起来得到最终的结果。

最近的分布式计算项目已经被用于使用世界各地成千上万位志愿者的计算机的闲置计算能力,通过因特网,可以分析来自外太空的电讯号,寻找隐蔽的黑洞,并探索可能存在的外星智慧生命;可以寻找超过1000万位数字的梅森质数;也可以寻找并发现对抗艾滋病病毒的更为有效的药物。这些项目都很庞大,需要惊人的计算量,仅仅由单个的电脑或是个人在一个能让人接受的时间内计算完成是绝不可能的。

1.3 区别

显然,分布式计算非常强调计算机网络中的计算机合作,并行式计算强调一个计算机的多个处理器合作。
(1)并行计算投入更多机器,数据大小不变,计算速度更快,而分布式计算投入更多的机器,能处理更大的数据;
(2)并行计算必须要求时间同步,而分布式计算没有时间限制。

2 Dask

Dask是一个用于分析计算的灵活的并行计算库。

在这里插入图片描述

pip install dask
python -m pip install "dask[array]"
python -m pip install "dask[distributed]"
python -m pip install "dask[dataframe]"

2.1 单机模式运行dask

#dask求解10个数的平均值
import dask.array as da
import numpy as np
x=np.arange(10000000)
#chunks表示划分时每块的大小(大数据超过内存容量时,需要对数据进行按块划分)
y=da.from_array(x,chunks=(100,))
print(y)
print(y.mean())
print(y.mean().compute())

2.2 分布式调度程序

首先在命令行窗口执行dask-scheduler命令,得到以下输出:
在这里插入图片描述
其中,tcp://192.168.1.4:8786可以做为当前电脑的url地址,在同一局域网下,可以在另一主机上通过client方法进行主机的连接。

(1)client内容为空或者为127.0.0.1.8786时,默认启动本地调度工作程序(此时客户端和本地客户端应建立连接),客户端将自身注册为默认的Dask调度程序。

from dask.distributed import Client
if __name__ == "__main__":client = Client()a = client.map(lambda x:x**2,range(10))b = client.map(lambda x:x+1,a)c = client.map(lambda x:-x,b)re = client.submit(sum, c).result()print(re)

(2)当client不为空,为另一主机的url时:
这时首先在当前客户机输入命令:

dask-worker 192.168.1.4:8786

此时将scheduler和workers绑定在一起。
在这里插入图片描述
结果表示客户机与主机连接成功,此时就能够分布式利用不同主机间运行程序。

from dask.distributed import Client
if __name__ == "__main__":client = Client("tcp://192.168.1.4:8786")a = client.map(lambda x:x**2,range(10))b = client.map(lambda x:x+1,a)c = client.map(lambda x:-x,b)re = client.submit(sum, c).result()print(re)

在这里插入图片描述

2.3 常用函数及部分概念

2.3.1 submit()和result()

(1)submit(方法,数值), 对数值执行某种方法。
(2)若想显示出来直观的结果,则调用result()方法。

from dask.distributed import Client
def inc(x):return x+1
if __name__ == "__main__":client = Client("tcp://192.168.1.4:8786")x1 = client.submit(inc,10)print(x1)print(x1.result())x2 = client.map(inc,range(2))print(x2)print(client.gather(x2))x3 = client.submit(sum,x2)print(x3)print(x3.result())

输出如下:

<Future: pending, key: inc-d3f5af4d5bb89c246f58e2a8fa150373>
11[<Future: pending, key: inc-9e50b1e0389d7a9c0a888ae20ae00cae>, 
<Future: pending, key: inc-d78d089440e3814014b4f8e92775a40e>]
[1, 2]<Future: pending, key: sum-36d98f2f40c36fc256240b1a9c0feadd>
3

(3)对于map()方法来说,map(方法,数值列表),通过遍历数值列表的数值进行数值计算,想直观的看到map()运行后的结果,需要调用client.garher(参数值)方法。

2.3.2 submit(pure=False)

(4)对于submit和map等函数运行结果中都出现了key关键词,可以试验并且发现,当调用的函数是纯函数时,所得的key应是完全一样的,这就是dask中避免重复计算所才用的策略,当出现重复的计算时,只需要比较key的值就能利用旧的结果,而不需要重新计算。

from dask.distributed import Client
from operator import add
if __name__ == "__main__":client = Client("tcp://192.168.1.4:8786")x = client.submit(add,1,2)y = client.submit(add,1,2)print(x.key)print(y.key)

在这里插入图片描述
(5)当函数不纯时,众所周知的就是random函数,每次执行的值都不同,但是函数是不变的,所以在dask中加入了一个参数:pure,当pure=False时,禁用以上功能。

from dask.distributed import Client
import numpy as np
if __name__ == "__main__":client = Client("tcp://192.168.1.4:8786")x = client.submit(np.random.random,3,pure=False)y = client.submit(np.random.random,3,pure=False)print(x.key)print(y.key)print(x.result())print(y.result())

在这里插入图片描述

2.3.3 将数据集发送到调度程序

from dask.distributed import Client
import dask.dataframe as dd
if __name__ == "__main__":client = Client("192.168.1.4:8786")df = dd.read_csv("data.csv")df = client.persist(df)client.publish_dataset(my_data=df)

my_data是把数据集命一个新的名称,在与调度机相连的任意客户机都能访问此数据集。

2.3.4 客户机访问数据集

from dask.distributed import Client
if __name__ == "__main__":client = Client("tcp://192.168.1.4:8786")print(client.list_datasets())df = client.get_dataset("my_data")

http://chatgpt.dhexx.cn/article/IjAWW3l7.shtml

相关文章

大数据技术入门:MapReduce(分布式计算框架)

大家好&#xff0c;我是百思不得小赵。 创作时间&#xff1a;2022 年 7 月 7 日 博客主页&#xff1a; &#x1f50d;点此进入博客主页 —— 新时代的农民工 &#x1f64a; —— 换一种思维逻辑去看待这个世界 &#x1f440; 今天是加入CSDN的第1222天。觉得有帮助麻烦&#x1…

05-分布式计算框架

目录 一&#xff0c;MapReduce 1&#xff0c;简介 2&#xff0c;原理 2.1 基本概念 2.2 程序执行过程 2.3 作业运行模式 二&#xff0c;Spark 1&#xff0c;简介 1.1 背景 1.2 概念 1.3 特点 2&#xff0c;原理 2.1 编程模型 2.2 运行模式 2.3 运行过程 2.4 DA…

大数据之Hadoop分布式计算框架MapReduce

这里写目录标题 一、MapReduce概述二、MapReduce编程模型简述三、MapReduce词频统计案例mvn clean package 四、词频统计案例进阶之Combiner五、词频统计案例进阶之Partitioner六、案例二介绍 一、MapReduce概述 Hadoop MapReduce 是一个分布式计算框架&#xff0c;用于编写批处…

分布式系列之分布式计算框架Flink深度解析

Flink作为主流的分布式计算框架&#xff0c;满足批流一体、高吞吐低时延、大规模复杂计算、高可靠的容错和多平台部署能力。本文简要介绍了Flink中的数据流处理流程以及基本部署架构和概念&#xff0c;以加深对分布式计算平台的了解。 1、Flink概述 Apache Flink是一个框架和分…

分布式计算框架——MapReduce

一、MapReduce概述 Hadoop MapReduce 是一个分布式计算框架&#xff0c;用于编写批处理应用程序。编写好的程序可以提交到 Hadoop 集群上用于并行处理大规模的数据集。 MapReduce 作业通过将输入的数据集拆分为独立的块&#xff0c;这些块由 map 以并行的方式处理&#xff0c…

【学习笔记1】分布式计算技术及框架

一.定义及描述 分布式计算(Distributed Computing)&#xff0c;又称分散式计算&#xff0c;指通过分布式系统进行计算的方式。分布式系统中的每一个运算单元存在于不同的计算机/处理器上&#xff0c;通过调度算法进行信息传递、协作以实现一件大而繁的目标。 简单来说&#x…

C#之简易计算器的制作

在一些问题中有时会用到计算器,今天我们可以用C#做一个简易的计算器 用到的开发工具为Visual Studio 2019(我用的是2019,其他版本的也可以) 1.首先新建一个项目文件. 2.在Form1.cs文件(Winform框架基础文件)中添加所用到的控件. 3.添加TextBox和ComboBox以及Button控件 4.对But…

JS原生——编写简易计算器

一个非常适合新手练习的小案例&#xff01;&#xff01;&#xff01; 使用JS的ES5语法HTMLCSS及企业级代码规范&#xff0c;方便后续良好的代码习惯养成&#xff01;&#xff01;&#xff01; 先来看一下样式吧&#xff01;&#xff01;&#xff01;&#xff08;后附代码&…

Java 实现简易计算器

前言&#xff1a; 出此文章是因为楼主之前在面试中遇到一个笔试题&#xff0c;当时一时半会没想出来&#xff0c;所以后续研究出来了&#xff0c;发出来希望对大家能有所帮助~ 题目&#xff1a;设计一个计算器&#xff0c;可以接收用户输入两个数字与 - * / 的符号&#xff0c…

Matlab设计简易计算器

效果如如下&#xff1a; 整个工程还是挺简单的&#xff0c;之前一直都是用matlab做信号处理&#xff0c;由于要做课程设计&#xff0c;就学了一下matlab的GUI。下面总结几个关键的地方。 &#xff08;1&#xff09;控件拉到自己喜欢的位置&#xff0c;并将控件的Text和Tag改好…

简易计算器(有界面)

&#xff08;没有括号和优先级&#xff0c;简易计算器&#xff09;界面&#xff1a; package javaprogram;import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import j…

Andriod设计简易计算器

1&#xff0e;设计任务及要求 &#xff08;1&#xff09;设计一款基于Android系统下的计算器&#xff0c;实现加减乘除算法&#xff0c;以及清零、撤销操作。界面设计应该就尽量简洁而美观&#xff0c;具有良好的交互性&#xff0c;程序应具有较好的稳健性&#xff1b; &a…

java实现简易计算器

Java简易计算器 用java语言写的一个简易计算器&#xff0c;实现了最基本的、-、*、/ 运算。 先来看下效果&#xff1a; 界面简述&#xff1a; 整个面板的由一个JTextFiled组件16个JButton组件构成&#xff0c;外加一个JPanel组件存放16个按钮&#xff0c;其布局为4x4的网格…

做一个简易计算器(VB版)

今天小编来带大家用VB做一个简易计算器 废话不多说&#xff0c;下面就是具体步骤了 1、创建控件组的方法首先创建一个命令按钮&#xff0c;调整其大小&#xff08;觉得合适就行&#xff09;&#xff0c;名称为Command1&#xff0c;Caption 属性为数字 0 &#xff1b;然后进行…

简易计算器的设计_C#课程设计

以下内容可且仅可供参考&#xff0c;如有错误欢迎指正。 部分内容借鉴自百度 侵删致歉 位切换键盘的实现用了复杂的拖64给label的方法&#xff0c;此功能可以在自己计算机上的计算器里找到。 目录 一、设计简介 1.设计背景 2.开发工具及环境 二、需求分析 1.设计功能要求 …

Python制作简易计算器(GUI)---Tkinter

Python制作简易计算器&#xff08;GUI&#xff09;---Tkinter Tkinter简介Tkinter 与 PyQt5 的比较TkinterPyQt5 项目展示导入模块函数封装1. 运算公式的拼接与展示2. 将显示框的内容删除3. 使用eval()函数对表达式求值 主逻辑1. 布局窗口2. 布局表达式展示区域3. 布局按钮 代码…

自制个性计算器

一、布局文件xml的制作。 如图&#xff1a;是布局之后的一个效果图 完全可以自定义自己喜欢的各种类型的图片。 代码如下&#xff1a; 正所谓每一个鲜艳靓丽app背后都有成堆的代码支撑这句话是没有错的。由于没有长截屏软件只能用短截屏了&#xff0c;大家谅解一下&#…

C++简易计算器的实现

定义&#xff1a; 计算器是近代人发明的可以进行数字运算的机器。 也就是说&#xff0c;计算器不等同于算盘&#xff0c;前者能自行运算&#xff0c;后者只能简便计算过程&#xff0c;在古代,人们发明了许多计算工具,如算筹、算盘、计算尺等,随着社会的发展和科技的进步,计算…

制作简易计算器

简易计算器 效果展示图项目要求内容分析涉及函数 效果展示图 项目要求 制作简易计算器&#xff0c;使其能实现简单的加&#xff0c;减&#xff0c;乘&#xff0c;除运算。 1.在两个文本框中分别输入两个数字 2.输入完成后&#xff0c;再次点击加&#xff0c;减&#xff0c;乘&…

C# 制作简易计算器

前言&#xff1a;环境是vs 2022 1、打开vs2022后&#xff0c;右边导航栏选择创建新项目。 2、选择Windows窗体应用&#xff08;.net Framework&#xff09; 3、进入配置新项目界面&#xff08;项目名称和位置可自行修改&#xff09;点击创建 4、窗体From1即为我们要要编辑的位…