python - 用 pandas 并行读取 CSV 会产生巨大的内存泄漏/进程僵尸

标签 python python-3.x csv pandas memory-leaks

我正在并行读取 +1000 ~200Mb CSV,然后使用 pandas 保存修改后的 CSV。这会产生许多僵尸进程,这些进程累积到 +128Gb 的 RAM,这会破坏性能。

    csv_data = []
    c = zip(a, b)
    process_pool = Pool(cpu_count())
    for name_and_index in process_pool.starmap(load_and_process_csv, c):
        csv_data.append(name_and_index)
    process_pool.terminate()
    process_pool.close()
    process_pool.join()

这是我目前的解决方案。在您处理超过 80 个 CSV 左右之前,它似乎不会引起问题。

PS:即使池已完成,~96Gb 的 RAM 仍然被占用,您可以看到 python 进程占用 RAM 但没有做任何事情也没有被销毁。此外,我确信池正在执行的功能正在运行完成。

我希望这已经足够描述了。

最佳答案

Python 的multiprocessing 模块是基于进程的。所以你有很多进程是很自然的。

更糟糕的是,这些进程不共享内存,而是通过pickling/unpickling进行通信。因此,如果需要在处理之间传输大量数据,它们会非常慢,这就是这里发生的情况。

对于这种情况,因为处理是 I/O 相关的,如果 I/O,使用带有 threading 模块的多线程可能会有更好的性能> 是瓶颈。线程共享内存,但它们也“共享”1 个 CPU 核心,因此不能保证运行得更快,您应该尝试一下。

更新:如果多线程没有帮助,您就没有太多选择了。因为这种情况恰恰是针对Python并行处理架构的致命弱点。您可能想尝试 dask(平行 Pandas ):http://dask.readthedocs.io/en/latest/

关于python - 用 pandas 并行读取 CSV 会产生巨大的内存泄漏/进程僵尸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43485744/

相关文章:

python - 更改编码python时数据从文件中消失

python - 在 telegram.org API 中响应 new_session_created 消息

python - 如何避免错误的输入/输出文件名以及 C 程序中的错误参数

python - While 在带有 input() 的函数中循环

csv - 从一个列表中减去另一个列表的最有效方法是什么?

python - moviepy subclip 函数中的名称错误

python-3.x - pip 安装成功后,aws cli 无法在 Jupyter 中工作?

django - apache2 python 3.4.3 ubuntu 错误 wsgi no module named

c - 如何从 CSV 文件(C 语言)读取和写入寄存器?

postgresql - CSV 中引用的雪花空值破坏了 PostgreSQL 卸载