dask数据框:合并两个数据框,估算缺失值并写入csv仅使用部分CPU(每个CPU中的20%)

时间:2019-04-09 18:48:00

标签: dask dask-distributed

我想合并两个dask数据框,用列中位数估算缺失值,然后将合并的数据框导出到csv文件。 我遇到一个问题:我当前的代码无法使用全部8个CPU(每个CPU的约20%)

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

import numpy as np
import pandas as pd 
df1 = pd.DataFrame(
    np.c_[(np.random.randint(100, size=(10000, 1)), np.random.randn(10000, 3))],
    columns=['id', 'a', 'b', 'c'])
df2 = pd.DataFrame(
    np.c_[(np.array(range(100)), np.random.randn(100, 10000))],
    columns=['id'] + ['d_' + str(i) for i in range(10000)])
df1.id=df1.id.astype(int).astype(object)
df2.id=df2.id.astype(int).astype(object)

## some cells are missing in df2
df2.iloc[:, 1:] = df2.iloc[:,1:].mask(np.random.random(df2.iloc[:, 1:].shape) < .05)

## dask codes starts here
import dask.dataframe as dd
from dask.distributed import Client
ddf1 = dd.from_pandas(df1, npartitions=3)
ddf2 = dd.from_pandas(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使用率吗?

1 个答案:

答案 0 :(得分:1)

首先,如果您没有另外指定,Dask将使用线程来执行。在线程中,一次只能执行一次python操作(“ GIL”),只有一些较低级别的代码明确释放了锁。 “合并”操作涉及内存中的大量数据改组,我怀疑有时会释放该锁。

第二,所有输出都被写入文件系统,因此这里总会有瓶颈:无论其他处理速度如何,您仍然需要通过存储总线来提供所有输出。

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