2014-12-02 120 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()從文件中檢索塊。您會注意到性能改進以及內存佔用減少。