Python使用Pool并行处理DataFrame时程序冻结问题排查
排查DataFrame并行处理时程序冻结的问题
嘿,咱们来看看你的DataFrame并行处理为啥会冻结。我发现代码里有几个关键问题,还有对应的修复方案:
1. Windows环境下缺少主程序入口(最可能的冻结原因)
在Windows系统中,multiprocessing创建子进程时会重新导入整个脚本。如果没把执行代码放在if __name__ == '__main__':块里,会触发无限递归创建进程,最终导致程序卡死冻结。这是这类问题最常见的诱因。
2. replace_data函数的低效写法
你用for循环逐行修改DataFrame,完全没用到Pandas的矢量化优势,既慢又没必要。Pandas的字符串列本身支持直接调用str.replace方法,一行代码就能完成循环里的操作。
修复后的完整代码
import pandas as pd import numpy as np from multiprocessing import cpu_count, Pool def replace_data(data): # 用矢量化操作替代逐行循环,高效且避免潜在的修改问题 data.iloc[:, 1] = data.iloc[:, 1].str.replace('in.', 'inch', regex=False) return data num_partitions = 10 num_cores = cpu_count() def parallelize_dataframe(df, func): df_split = np.array_split(df, num_partitions) pool = Pool(num_cores) df = pd.concat(pool.map(func, df_split)) pool.close() pool.join() return df # 核心:把主执行逻辑放在__main__块里,避免进程递归创建 if __name__ == '__main__': attributes1 = pd.read_csv('attributes1.csv') df1 = parallelize_dataframe(attributes1, replace_data) # 可以打印前几行验证结果 print(df1.head())
额外优化建议
- 如果你的数据量不是特别大,其实完全不需要并行。Pandas的矢量化操作本身已经足够高效,并行带来的进程调度开销反而会拖慢速度。直接执行下面一行代码就能完成任务:
attributes1.iloc[:, 1] = attributes1.iloc[:, 1].str.replace('in.', 'inch', regex=False) - 如果确实需要并行,建议让
num_partitions的数量和num_cores相当或略多,避免进程闲置浪费资源。
内容的提问来源于stack exchange,提问作者Theodosis Siomos
相关产品推荐
相关产品推荐

