我正在尝试使用多处理模块在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
值的文件中。让工作人员返回状态代码,以便您可以确定是成功还是失败。如果失败,还要返回成功完成的数据量的某种索引,因此您不必再次重新计算。
文件格式应简单且可读。 例如,每行一个数字。
等待所有进程完成,读取文件并填充数据帧。