2017-12-12 8 views
0

HPCでマルチプロセッシングを使用してコードを高速化しようとしました。それはOKを実行していたが、私はいくつかの計算を追加し、突然このエラーを投稿し始めた。私はマルチプロセッシングをせずに走らせても問題ありませんでした。壊れたパイプ:マルチプロセスプールからマップを使用

最初の〜20回の関数の実行はマルチプロセッシングには適していますが、その後はスノーボールを開始し、このエラーは頻繁に表示されます。

で「ある時点でステップのメモリ制限を超過」とすることを書かれているログ:私は「理由 『はRuntimeError(』 Pythonオブジェクトを呼び出している間、最大再帰の深さを超え 『』)」

import os 
from multiprocessing import Pool 

def eigencen(filename): 
    --DO complicated stuff here-- 

for f in os.listdir(FOLDER): 
    list_fn.extend([f]) 

def evaluation(f_list): 
    return list(Pool(processes=28).map(eigencen, f_list)) 
evaluation(list_fn) 

をすることができ何とか修正しますか?マルチプロセッシングがなければ、それは永遠に走り出すでしょう。

+0

が質問CPUのタスクは負荷をかけますか?そうでない場合は、代わりにスレッドを使用できます。 – kingJulian

+0

これはかなりのメモリを消費します。私は28のコアを持つ1つのノード上で実行します。そして、何らかの仕方で、メモリは次のプロセスのために空ではないと思います。これは私の推測です。 –

+0

この場合、マルチプロセッシングモジュールをキューと組み合わせて使用​​することができます。一般に、キューを使用すると、プールプロセスを制御する面でより柔軟になります。別の考え方は、map関数も持つconcurrent.futures.ProcessPoolExecutorクラスを使用することです。 – kingJulian

答えて

1

concurrent.futuresモジュールを試してみてください:

from concurrent import futures 

def evaluation(f_list): 
    with futures.ProcessPoolExecutor() as pool: 
     return pool.map(eigencen, f_list) 
+0

ありがとうございました!私は何かがマルチプロセッシングタスクパーティションに間違っていたと思います。 –

関連する問題