3

python に反復可能なオブジェクトがありますがZ、これは大きすぎてメモリに収まりません。このオブジェクトに対して並列計算を実行し、結果が に表示されるようZにファイルに書き込みたいと考えています。次のばかげた例を考えてみましょう。

import numpy as np
import multiprocessing as mp
import itertools as itr

FOUT = open("test",'w')

def f(x):
    val = hash(np.random.random())
    FOUT.write("%s\n"%val)

N = 10**9
Z = itr.repeat(0,N)

P = mp.Pool()
P.map(f,Z,chunksize=50)
P.close()
P.join()

FOUT.close()

これには 2 つの大きな問題があります。

  1. 複数の結果を同じ行に書き込むことができます
  2. オブジェクトを含む結果が返されNます - これはメモリに保持するには大きすぎます (必要ありません!)。

私が試したこと

  • mp.Lock()リソースを共有するためにグローバルロックを使用するFOUTことは役に立ちません。各ワーカーが独自の名前空間を作成すると思うからです。
  • apply_async代わりに使用map: コールバック修正 1]、2] がある間、反復可能なオブジェクトを受け入れません。
  • imapの代わりに使用mapして、結果を反復処理します。

何かのようなもの:

def f(x):
    val = hash(np.random.random())
    return val

P = mp.Pool()
C = P.imap(f,Z,chunksize=50)
for x in C: 
    FOUT.write("%s\n"%x)

理由はわかりませんが、これはまだ大量のメモリを使用しています。

4

0 に答える 0