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能够运行代码(但这比我提到的进程池方法所需的时间要长得多)
我使用的是python3.6.10
和Dask2.17.2