尝试初始化数据帧列时,多处理代码不起作用



我正在尝试使用多处理模块在Python 3.6中使用单独的CPU内核初始化数据帧的每一列,但我的代码不起作用。有人知道此代码的问题吗?我感谢您的帮助。

我的笔记本电脑有Windows 10,它的CPU是Core i7 8th Gen:

import time        
import pandas as pd
import numpy as np
import multiprocessing 
df=pd.DataFrame(index=range(10),columns=["A","B","C","D"])

def multiprocessing_func(col):
for i in range(0,df.shape[0]):
df.iloc[i,col]=np.random(4)
print("column "+str(col)+ " is completed" )

if __name__ == '__main__':
starttime = time.time()
processes = []
for i in range(0,df.shape[1]):
p = multiprocessing.Process(target=multiprocessing_func, args=(i,))
processes.append(p)
p.start()
for process in processes:
process.join()
print('That took {} seconds'.format(time.time() - starttime))

当你启动一个Process时,它基本上是父进程的副本。(我在这里跳过了一些细节,但它们对解释来说并不重要(。

与线程不同,进程不共享数据。(进程可以使用共享内存,但这不是自动的。据我所知,multiprocessing共享数据的机制无法处理dataframe

因此,发生的情况是,每个工作进程都在修改自己的数据帧副本而不是父进程中的数据帧。

为此,您必须将新数据发送回父流程。你可以做到这一点,例如return从工作器函数中获取它,然后将返回的数据放入原始数据帧中。

只有当生成数据的工作比启动新的工作进程、将数据发送回父进程并将其放入数据帧时花费的时间要长得多时,使用这样的multiprocessing才有意义。由于您基本上是用随机数据填充列,因此我认为这里不是这种情况。 所以我不明白你为什么要在这里使用multiprocessing


编辑:根据您的评论,计算每列需要几天时间,我会提出以下建议。

像您一直在做的那样使用Proces,但让每个工作进程将它们生成的数字保存在文件名包含i值的文件中。让工作人员返回状态代码,以便您可以确定是成功还是失败。如果失败,还要返回成功完成的数据量的某种索引,因此您不必再次重新计算。

文件格式应简单且可读。 例如,每行一个数字。

等待所有进程完成,读取文件并填充数据帧。

相关内容

  • 没有找到相关文章

最新更新