dask数据帧:合并两个数据帧,输入缺失值并仅使用部分CPU写入csv(每个CPU中占20%)

dask数据帧:合并两个数据帧,输入缺失值并仅使用部分CPU写入csv(每个CPU中占20%),dask,dask-distributed,Dask,Dask Distributed,我想合并两个dask数据帧,用列中值填充缺失值,并将合并后的数据帧导出到csv文件。 我有一个问题:我当前的代码无法利用所有8个CPU(每个CPU的20%) 我不确定哪一部分限制了CPU的使用。这是可重复的代码 将numpy导入为np 作为pd进口熊猫 df1=pd.DataFrame( np.c_u[(np.random.randint(100,size=(10000,1)),np.random.randn(10000,3))], 列=['id'、'a'、'b'、'c']) df2=pd.Da

我想合并两个dask数据帧,用列中值填充缺失值,并将合并后的数据帧导出到csv文件。 我有一个问题:我当前的代码无法利用所有8个CPU(每个CPU的20%)

我不确定哪一部分限制了CPU的使用。这是可重复的代码

将numpy导入为np
作为pd进口熊猫
df1=pd.DataFrame(
np.c_u[(np.random.randint(100,size=(10000,1)),np.random.randn(10000,3))],
列=['id'、'a'、'b'、'c'])
df2=pd.DataFrame(
np.c_[(np.array(range(100)),np.random.randn(10010000))],
列=['id']+['d_'+str(i)表示范围内的i(10000)])
df1.id=df1.id.astype(int).astype(object)
df2.id=df2.id.astype(int).astype(object)
##df2中缺少一些单元格
df2.iloc[:,1:]=df2.iloc[:,1:].mask(np.random.random(df2.iloc[:,1:].shape)<.05)
##dask代码从这里开始
将dask.dataframe作为dd导入
从dask.distributed导入客户端
ddf1=dd.from_熊猫(df1,npartitions=3)
ddf2=dd.from_熊猫(df2,npartitions=3)
ddf=ddf1.merge(ddf2,how='left',on='id')
ddf=ddf.fillna(ddf.quantile())
ddf.to_csv('train_*.csv',index=None,header=None)

尽管所有8个CPU都被调用以使用,但每个CPU的利用率只有约20%。我可以编写代码来提高CPU使用率吗?

首先,如果不另行指定,Dask将使用线程执行。在线程中,一次只能发生一个python操作(“GIL”),除了一些显式释放锁的低级代码。“合并”操作涉及内存中大量数据的洗牌,我怀疑有时会释放锁

第二,所有的输出都被写入文件系统,因此这里总是会有一个瓶颈:不管其他处理速度有多快,您仍然需要通过存储总线将所有的输出提供给文件系统

如果CPU工作在20%左右,我敢说这仍然比单核版本快?简单地说,有些工作负载的并行性比其他工作负载要好