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 つの大きな問題があります。
- 複数の結果を同じ行に書き込むことができます
- オブジェクトを含む結果が返され
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)
理由はわかりませんが、これはまだ大量のメモリを使用しています。