とてもつらい

プログラミングと本のメモ

pythonのPoolを使って並列化するときにメモリを食いつぶした問題

python2系で大きいデータを並列処理しようとした時に、メモリを食いつぶしてしまったので、メモ。 以下のような処理をしたら、Poolで並列化したプロセスが処理が終わったあとも死なずに残りプロセスが増えすぎてメモリを食いつぶしてしまった。

from multiprocessing import Pool

def f(x):
    return x*x

if __name__ == '__main__':
    pool = Pool(processes=4)              
    print pool.map(f, range(100000))  

いろいろ調べた結果以下の記事が参考になった。

http://qiita.com/tnarihi/items/a0dfb43fa989c3c8fc55

原因は、Poolは、処理が全部終わるまで、プロセスが死なず、新しいプロセスを生み続けるようになっていることっぽかった。 これは、Processで書き直すで解決した。 Processを使う場合は、Process一個につき、一つのデータしか処理できないので、ちょっと工夫が必要。 大きいデータの時は、Processで書いて、小さいデータの時は、実装コストを減らすために、Poolでとか使い分けるのがいいのかな。