为什么将pandas DataFrame传入多进程函数后原数据没有变化
问题原因
- Python
multiprocessing模块默认采用进程隔离的运行模式:父进程启动子进程时,会将传入的参数序列化后拷贝到子进程的独立内存空间中,子进程对参数的所有修改都只会作用于本地副本,不会反向同步到父进程的原始变量。 - 你当前的
changeDF函数没有返回值,只是直接修改传入的DataFrame对象,所有修改都只发生在子进程的副本上,父进程的df1、df2自然不会有变化。
解决方案
最简单的适配方案是修改函数逻辑,将修改后的DataFrame作为返回值传回父进程,父进程接收返回值后替换原变量即可,示例代码如下:
import multiprocessing import pandas as pd df1 = pd.DataFrame( { "A": ["A0", "A1", "A2", "A3"], "B": ["B0", "B1", "B2", "B3"], "C": ["C0", "C1", "C2", "C3"], "D": ["D0", "D1", "D2", "D3"], } ) df2 = pd.DataFrame( { "A": ["A4", "A5", "A6", "A7"], "B": ["B4", "B5", "B6", "B7"], "C": ["C4", "C5", "C6", "C7"], "D": ["D4", "D5", "D6", "D7"], } ) # 修改函数,返回处理后的df def changeDF(df): df['Signal'] = 0 return df if __name__ == '__main__': # Windows平台必须加这行防止多进程无限递归启动 s = [df1, df2] with multiprocessing.Pool(processes=2) as pool: res = pool.map(changeDF, s) # 用返回的结果替换原变量 df1, df2 = res
补充说明:如果处理的DataFrame体积很大,反复拷贝会占用过多内存,可以考虑使用multiprocessing.Array等共享内存结构存储数据,避免跨进程拷贝,但实现复杂度更高,常规场景下直接返回处理结果的方案更易用。
内容的提问来源于stack exchange,提问作者BinaryThinker
相关产品推荐
相关产品推荐

