這似乎是一個簡單的問題,但我無法讓我的頭在附近。使用多處理將數據寫入hdf文件
我有一個模擬運行在一個雙循環,並將結果寫入HDF文件。這個程序的簡化版本如下所示:
import tables as pt
a = range(10)
b = range(5)
def Simulation():
hdf = pt.openFile('simulation.h5',mode='w')
for ii in a:
print(ii)
hdf.createGroup('/','A%s'%ii)
for i in b:
hdf.createArray('/A%s'%ii,'B%s'%i,[ii,i])
hdf.close()
return
Simulation()
此代碼不正是我想要的,但因爲過程可能需要相當長的時間來運行我試圖用多模塊,並使用下面的代碼:
import multiprocessing
import tables as pt
a = range(10)
b = range(5)
def Simulation(ii):
hdf = pt.openFile('simulation.h5',mode='w')
print(ii)
hdf.createGroup('/','A%s'%ii)
for i in b:
hdf.createArray('/A%s'%ii,'B%s'%i,[ii,i])
hdf.close()
return
if __name__ == '__main__':
jobs = []
for ii in a:
p = multiprocessing.Process(target=Simulation, args=(ii,))
jobs.append(p)
p.start()
然而,這隻會將最後一次模擬打印到HDF文件,不知何故它會覆蓋所有其他組。
除了這個問題,我已經使用上面的代碼成功了,但現在我擴展了這個模擬,由a = range(1000)定義的for循環以及由b = range(100)定義的for循環。這種保護措施可以大量使用我的記憶。我有8個CPU和16 Gb RAM,但是當我運行該文件時(即使沒有真實的模擬),我的RAM使用率達到100%,這導致我的系統失速。 – user2143958
我認爲我們需要將任務數量與子流程數量分開。這聽起來像你想要1000個任務,但可能不是1000個子進程。我會編輯帖子,提出一種可以做到的方式。 – unutbu
是的你是對的,在前面的例子中,對於大的迭代,同樣大量的子進程被創建,堵塞了所有的內存。您編輯的文件完美無瑕!但僅僅爲了澄清,我也在嘗試使用Pool()函數,並且此函數似乎也很好,但當需要傳遞多個變量時,它會變得更加困難。通過Pool()函數選擇Process()函數的主要原因是什麼? – user2143958