我正在并行读取 +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/