進口大熊貓的Python熊貓據幀內存分配爲PD 進口GC在For循環
我遇到了我的管理與熊貓DataFrames內存在for循環中的困難。我合併大約10-20 GB的文件,然後我在做groupby聚合(我的總RAM是128 GB,所以我應該大部分都可以)。
我的工作流程因此而建立。做一些非常內存密集的任務,命中或不命中內存限制(128 GB),如果命中限制,然後將數據拆分成塊(在第i塊上執行任務,寫入磁盤,在第i + 1塊上執行任務,追加到磁盤)。爲了進一步說明請參見下面的僞代碼:
def somethingfunc(x):
#read a whole bunch of data w/ pandas, merge and do groupbys
for i in range(x):
#read data
data1 = pd.read_csv(...)
data2 = pd.read_csv(...)
#get ith chunk of data1
data1 = function_that_gets_ith_chunk_of_data1(data1)
#merge data
datamerge = pd.merge(..., how = 'inner')
datamerge = datamerge.groupby(...)
#either write chunk to memory or append
if i == 0:
datamerge.to_csv(...)
elif i>0:
datamerge.to_csv(..., mode= 'a', header ='none')
for x in range(10):
try:
somethingfunc(x+1)
#do something memory intensive dividing data into (x+1) chunks
except MemoryError:
pass
else:
break
,當我從做與數據的任務在1塊到2塊去的問題就來了。當我在1塊中完成任務並遇到內存限制時,我希望它在進入2之前釋放1塊進程中的所有數據。我嘗試了多種方法來執行此操作(確保該進程是自己的函數,顯式調用gc.collect()等)。我知道我的代碼有效,因爲我並不總是達到內存限制,但是當我這樣做時,我的代碼塊解決方案不起作用。有沒有人知道發佈以前迭代使用的所有數據的好方法?
看來非常奇怪,如果一組變量的函數內建立,如果說功能終止,那蟒蛇不僅節省了這些變量,但他們不能GC.Collect的()進行清理
編輯:我的注意力被稱爲Dask,我正在閱讀文檔,但在此期間,如果有人知道如何在Dask中做到這一點,這將是一個可以接受的答案
作爲您潛在探索的一面,你可以自動爲你解決這類問題,所以你不需要手動處理內存分配和手動拆分數據幀等。 – Boud
有趣的。謝謝,我會看看這個。 – sfortney