4

我正在开发一个分析大文件的工具。为了更快地做到这一点,我在它上面引入了多处理,一切似乎都工作正常。为了做到这一点,我正在使用 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()

如您所见,这是标准池执行,没有特殊用途。

最近,当我运行大量数据时,我发现了一个问题。16 个线程的标准执行大约需要 2 个小时,但我有一个特殊情况,需要大约 8 个小时,因为它的文件数量和大小都非常大。

问题是最近我发现当我执行这个案例时,执行运行良好,直到完成,除了一个被卡住的孩子之外,大多数孩子都能正常完成

<built-in method recv of _multiprocessing.Connection object at remote 0x3698db0>

由于这个孩子没有完成父母不会醒来并且执行停止。

这种情况仅在输入文件非常大时才会发生,所以我想知道是否存在任何可能导致此问题的默认超时。

我正在使用 python 2.7 多处理 0.70a1

我的机器是centos 7(32核,64GB RAM)

在此先感谢您的帮助

霍尔迪

4

1 回答 1

2

从多处理编程指南:

避免共享状态

As far as possible one should try to avoid shifting large amounts of data between processes.

如果您必须通过多个进程拆分文件处理,最好指导他们如何检索文件块,而不是自己发送块。

尝试将块偏移量和块大小传递给子进程。它可以使用 open() 和 seek() 从文件中检索块。您会注意到性能的提高和内存占用的减少。

于 2015-01-03T16:54:03.087 回答