You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:06:06