【发布时间】:2019-06-28 20:01:27
【问题描述】:
我正在尝试在 python 的多处理模块中使用池类来并行处理 Pandas 数据帧的一些数据(在下面的“主代码”标题下提到的代码)。问题是我的代码被卡住并且没有完成运行,无论我提供给它的输入数据帧多么小(甚至小到 10 行)。我还尝试运行一个简单的示例代码(在下面的“池示例”标题下提到的代码),甚至没有运行。
以下是我在下面的代码中尝试执行的操作的详细说明: 我有一个索引数据框,它有 10 列和 650K 行。这个想法是在索引数据帧的每一行中获取 10 个值,对于具有来自目标数据帧“traindat”的这些索引的行,取其中几个列的平均值。我必须对所有索引数据帧行(650K)执行此操作。
主要代码:
from multiprocessing import Pool
def func(x,i):
dftmp=traindat.iloc[x,4:28].mean()
return pd.DataFrame(dftmp).transpose()
pool = mp.Pool(processes=3)
new_rows = pool.map(func, [(row,idx) for idx,row in indices.iterrows()])
pool.close()
pool.join()
data_all_new = pd.concat(new_rows)
由于此代码无法运行,我还尝试了以下简单代码来查看池是否为我运行。但事实并非如此。 池示例:
import sys
sys.modules['__main__'].__file__ = 'ipython'
from multiprocessing import Pool
def f(x):
return x*x
if __name__ == '__main__':
p = Pool(5)
print(p.map(f, [1, 2, 3]))
我的代码没有任何错误。它只是卡住并且没有完成运行。如果你理解这个问题,请帮助我。
编辑:我后来意识到这个问题只发生在 Windows 中。所以编辑问题以包含它。
【问题讨论】:
-
为什么要更改模块文件?这会破坏酸洗,
DataFrame.iterrows也真的很慢,如果可以的话,避免它! -
查看stackoverflow.com/a/54219990/1358308,我在处理 10k 行时使用其他东西从
iterrows的 ~1 秒到 ~2ms -
谢谢山姆!我根据我对这篇文章的解释编辑了模块:[stackoverflow.com/questions/34086112/…。即使我不修改池文件,“主代码”和“示例代码”都不会运行。我当然会尝试您提到的有关 iterrows 的内容,但我需要解决更基本的问题,因为即使“示例代码”也没有完成运行。我认为这个问题也可能与我系统上的多处理模块安装有关。
-
可能值得使用 jupyter notebook 以外的东西,因为该答案指出它会以微妙的方式破坏事物。如果你是,我建议编辑问题并将
jupyter-notebook添加为标签。另外,我希望你做的比func做得更多,你可以在 numpy 中非常有效地做这种事情,np.mean(x[:,4:28], axis=1)[:,None]其中x是一个 1M x 30 元素矩阵,对我来说大约需要 25ms。 -
基本上我必须一次计算 10 行数据帧 (traindat) 的 24 列的平均值。我从我在上面称为“索引”的数据帧的每一行(它有 10 列)中获取这些“10 行 traindat”的索引。我必须对所有 650K 行“索引”数据框重复此操作。
标签: python windows pandas multiprocessing