Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.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 Dask-如何有效地执行正确数量的任务_Python_Dask_Dask Distributed_Dask Dataframe - Fatal编程技术网

Python Dask-如何有效地执行正确数量的任务

Python Dask-如何有效地执行正确数量的任务,python,dask,dask-distributed,dask-dataframe,Python,Dask,Dask Distributed,Dask Dataframe,我试图屏蔽,然后对一列应用unique操作。我正在使用的代码的简化版本报告如下: import numpy as np import pandas as pd import dask.dataframe as dd data = np.random.randint(0,100,(1000,2)) ddf = dd.from_pandas(pd.DataFrame(data, columns = ['data','id']), npartitions = 2) mask = ddf['data

我试图屏蔽,然后对一列应用
unique
操作。我正在使用的代码的简化版本报告如下:

import numpy as np
import pandas as pd
import dask.dataframe as dd

data = np.random.randint(0,100,(1000,2))
ddf = dd.from_pandas(pd.DataFrame(data, columns = ['data','id']), npartitions = 2)

mask = ddf['data'] > 0
unique_false = ddf[~mask]['id'].unique()
unique_true = ddf[mask]['id'].unique()

results = dask.compute([unique_true, unique_false])
这个简单的例子很好用。我的真实数据由
~5000
列组成,其中一列用于过滤,另一列用于获取唯一ID。数据存储在
200
拼花地板分区中,每个分区的权重为9MB,但当加载到内存中时(
ddf.get\u分区(0.compute().info()
)权重为
~5GB
)。考虑到我有大约400GB的RAM,我假设我可以加载大约80个分区(考虑到其他操作的开销,可能会更少)。从仪表板上,我可以看到dask试图一次执行所有任务(内存中的任务总是相同的,不管有多少工人)

我写这篇文章是为了测试处理分区所需的时间:

start = time.time()

df = ddf.get_partition(0).compute()

mask = df['data'] > 0

unique_true = df[mask]['id'].unique()
unique_false = df[~mask]['id'].unique()

print(time.time() - start)
它需要大约
60秒
,并且需要大约
7GB的RAM。如果我启动一个ProcessPool,并假设我一次只运行
50
个分区,则需要
4-5
分钟

我知道Dask的核心与我使用单个分区所做的一样,所以我的问题是为什么Dask会尝试并行执行所有任务,而不是一次执行一个任务?有没有办法限制任务的执行?这是真正的问题还是我遗漏了什么

我在这里发现了几个限制任务执行的问题。此处的所有点:。然而,我相信我不应该强迫这种行为,让达斯克尽其所能。我还应该提到,当在单线程中设置5个工作线程,每个线程有80GB的RAM时,Dask能够运行代码(但这比我提到的进程池方法所需的时间要长得多)

我使用的是python
3.6.10
和Dask
2.17.2