2014-12-02 227 views
2

我正在开发一个分析大文件的工具。为了做到这一点,我引入了多处理,并且一切看起来都很好。为了做到这一点,我使用multiprocessing.pool创建了N个线程,并处理了我以前创建的不同块。python多处理。池长时间执行后卡住了

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个小时,因为它的文件和大小非常大。

的问题是,最近我发现,当我执行这种情况下,执行运行良好,直到终点,大多数孩子的的完成正确,除了一个得到stucked上

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

因为这个孩子没有完成父母不会醒来,执行停止。

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

我使用Python 2.7 多处理0.70a1

和我的机器是一个CentOS 7(32个核心,64GB RAM)

在此先感谢您的帮助

霍尔迪

+0

我认为问题在于您不保留结果对象并调用result.get()将结果消息从队列中拉出。 – tdelaney 2014-12-02 16:16:01

+0

我没有任何结果。我把结果放在一个pickle文件中,父母读取并收集它们。 – jvaquero 2014-12-02 17:44:36

+0

无论您的目标函数是否返回值,apply_async总是返回一个ApplyResult对象。我的猜测是结果队列填满了子进程块。如果将结果添加到列表中,然后执行result for result:result.get(),它将冲洗队列。我不是100%肯定的,所以没有把它写成答案。 – tdelaney 2014-12-02 17:53:11

回答

1

来自多处理编程指南:

Avoi d共享状态

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

如果你通过几个流程拆分文件处理,这是更好地指导他们如何获取文件块而不是将自己的数据块。

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