我正在使用multiprocessing.Pool()
來並行化一些繁重的計算。使用大數據進行多處理
目標函數返回大量數據(一個巨大的列表)。我用完了RAM。
沒有multiprocessing
,我只是將目標函數轉換爲一個生成器,然後將生成的元素一個接一個地計算出來。
我知道多處理不支持生成器 - 它等待整個輸出並立即返回,對吧?沒有屈服。有沒有辦法讓Pool
工作人員在數據可用時立即生成數據,而無需在RAM中構建整個結果數組?
簡單的例子:
def target_fnc(arg):
result = []
for i in xrange(1000000):
result.append('dvsdbdfbngd') # <== would like to just use yield!
return result
def process_args(some_args):
pool = Pool(16)
for result in pool.imap_unordered(target_fnc, some_args):
for element in result:
yield element
這是Python 2.7版。
隊列將傳遞pickle數據。所以數據 - > pickle-> unpickle->新的數據副本。這會減慢程序速度並使用更多的額外RAM。應該考慮使用共享內存。 – Wang