进口大熊猫的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