次のように要約できるプログラムを作成しました。
def loadHugeData():
#load it
return data
def processHugeData(data, res_queue):
for item in data:
#process it
res_queue.put(result)
res_queue.put("END")
def writeOutput(outFile, res_queue):
with open(outFile, 'w') as f
res=res_queue.get()
while res!='END':
f.write(res)
res=res_queue.get()
res_queue = multiprocessing.Queue()
if __name__ == '__main__':
data=loadHugeData()
p = multiprocessing.Process(target=writeOutput, args=(outFile, res_queue))
p.start()
processHugeData(data, res_queue)
p.join()
実際のコード (特にwriteOutput()
) はもっと複雑です。writeOutput()
引数として取るこれらの値のみを使用します (つまり、 を参照しませんdata
) 。
基本的に、巨大なデータセットをメモリにロードして処理します。出力の書き込みはサブプロセスに委任されます (実際には複数のファイルに書き込み、これには多くの時間がかかります)。そのため、1 つのデータ項目が処理されるたびに、それが res_queue を通じてサブプロセスに送信され、必要に応じて結果がファイルに書き込まれます。
サブプロセスは、ロードされたデータにアクセスしたり、読み取ったり、変更したりする必要はありませんloadHugeData()
。サブプロセスは、メインプロセスが送信したものを使用するだけで済みますres_queue
。そして、これは私の問題と質問につながります。
サブプロセスが巨大なデータセットの独自のコピーを取得しているように思えます(でメモリ使用量をチェックするときtop
)。これは本当ですか?もしそうなら、どうすればidを回避できますか(本質的に二重メモリを使用して)?
私は Python 2.6 を使用しており、プログラムは Linux で実行されています。