我想合并两个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使用率吗?
答案 0 :(得分:1)
首先,如果您没有另外指定,Dask将使用线程来执行。在线程中,一次只能执行一次python操作(“ GIL”),只有一些较低级别的代码明确释放了锁。 “合并”操作涉及内存中的大量数据改组,我怀疑有时会释放该锁。
第二,所有输出都被写入文件系统,因此这里总会有瓶颈:无论其他处理速度如何,您仍然需要通过存储总线来提供所有输出。
如果CPU工作在20%左右,我敢说这仍然比单核版本快吗?简而言之,某些工作负载的并行性要好于其他工作负载。