Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 达斯克';它在单核上的计算性能很慢_Python_Dask_Dask Distributed - Fatal编程技术网

Python 达斯克';它在单核上的计算性能很慢

Python 达斯克';它在单核上的计算性能很慢,python,dask,dask-distributed,Python,Dask,Dask Distributed,我实现了一个映射函数,它将字符串解析为XML树,遍历该树并提取一些信息。很多if-then-else的东西,没有额外的IO代码 我们从Dask获得的加速不是很令人满意,因此我们仔细研究了单个分区中单个但很大的项(580MB的XML字符串)的原始执行性能 代码如下: def timedMap(x): start = time.time() # computation, no IO or access to Dask variables, no threading or multiproce

我实现了一个映射函数,它将字符串解析为XML树,遍历该树并提取一些信息。很多if-then-else的东西,没有额外的IO代码

我们从Dask获得的加速不是很令人满意,因此我们仔细研究了单个分区中单个但很大的项(580MB的XML字符串)的原始执行性能

代码如下:

def timedMap(x):
  start = time.time()
  # computation, no IO or access to Dask variables, no threading or multiprocessing
  ...
  return time.time() - start

print("Direct Execution")
print(timedMap(xml_string))

print("Dask Distributed")
import dask
from dask.distributed import Client
client = Client(threads_per_worker=1, n_workers=1)
print(client.submit(timedMap, xml_string).result())
client.close()

print("Dask Multiprocessing")
import dask.bag as db
bag = db.from_sequence([xml_string], npartitions=1)
print(bag.map(timedMap).compute()[0])
输出(即没有前后开销的时间)为:

我已经重复了很多次了。似乎Dask不仅有通信和任务管理的开销,而且单个计算步骤也明显较慢

为什么Dask内部的计算速度要慢得多?我怀疑探查器,并将探查间隔从10秒增加到1000毫秒,持续5秒。但还是。。。然后我怀疑内存压力,但工作人员没有达到它的极限,甚至没有达到50%

在开销方面(测量提交+结果和映射+计算的总时间),Dask在分布式情况下增加18秒,在多处理情况下增加3秒。我很乐意支付这笔开销,但我不喜欢实际计算花费这么长的时间。你知道为什么会这样吗?我可以调整什么来加快速度

注意:当我将计算负载加倍时,所有持续时间也大致加倍

祝你一切顺利,
Boris

您不应该期望任何加速,因为您只有一个分区


由于在Python中跨进程移动了500MB的内存,所以应该会出现一些减速。我建议您阅读以下内容:

与直接执行相比,使用dask有一些开销,但18秒看起来确实很大。我可以要求您生成一份性能报告吗:嗯,18秒只是实际计算前后的开销。但是由于纯计算也需要32秒(这是我最讨厌的),55秒任务的总开销是50秒!以下是报告:timedMap在第一页上花费了88.79秒,在worker profile中是75.5秒(为什么会有差异?)。整个过程需要99秒的挂钟时间。与直接执行所需的54.5秒相比,所有这些都非常慢。我只使用单个分区进行调试。如果您查看上面定义的timedMap函数,您将看到计算时间是在这个函数中测量的,因此没有在进程之间移动数据所需的时间!我希望这与直接执行时间相似,但它不是。。。
Direct Execution
54.59478211402893
Dask Distributed
91.79525017738342
Dask Multiprocessing
86.94628381729126