我正在开发一个分析大文件的工具。为了更快地做到这一点,我在其上引入了多处理,一切似乎都运行正常。为了做到这一点,我使用multiprocessing.pool创建N个线程,它们处理我之前创建的不同的工作块。
pool = Pool(processes=params.nthreads)
for chunk in chunk_list:
pool.apply_async(__parallel_quant, [filelist, chunk, outfilename])
pool.close()
pool.join()
如您所见,这是标准池执行,没有特殊用途。
最近,当我运行大量数据时,我发现了一个问题。标准执行需要大约2个小时,有16个线程,但我有一个特殊情况需要大约8个小时,因为它有大量的文件和大小。
问题是,最近我发现当我执行这个案例时,执行运行正常,直到完成,大多数孩子正常完成,除了一个被卡住的孩子
<built-in method recv of _multiprocessing.Connection object at remote 0x3698db0>
由于这个孩子没有完成,父母不会醒来并且执行停止。
这种情况只发生在输入文件非常大的情况下,所以我想知道是否存在任何可能导致此问题的默认超时。
我正在使用python 2.7 多处理0.70a1
我的机器是一个centos 7(32核,64GB RAM)
提前感谢您的帮助
霍尔迪阿
答案 0 :(得分:1)
从多处理编程指南中:
避免共享状态
As far as possible one should try to avoid shifting large amounts of data between processes.
如果必须通过多个进程分割文件处理,最好指导他们如何检索文件块而不是自己发送块。
尝试将块偏移量和块大小传递给子进程。它可以使用open()和seek()从文件中检索块。您会注意到性能的提高以及内存占用的减少。