2016-11-21 190 views
0

進口大熊貓的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中做到這一點,這將是一個可以接受的答案

+1

作爲您潛在探索的一面,你可以自動爲你解決這類問題,所以你不需要手動處理內存分配和手動拆分數據幀等。 – Boud

+0

有趣的。謝謝,我會看看這個。 – sfortney

回答

0

這並不完全回答我的上面的問題,但它似乎正確的方式來做到這一點是在dask。這將隱含地做我上面討論的塊迭代。