2016-11-21 127 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。这将隐含地做我上面讨论的块迭代。