删除和释放单个 pandas dataframe 的内存

6

我正在使用 pandas 运行一个长时间的 ETL 管道。我必须创建不同的 pandas 数据帧,并且我想要释放一些数据帧的内存。

我一直在阅读如何释放内存,我看到运行此命令并不会释放内存:

del dataframe

请参考这个链接:如何删除多个Pandas(Python)数据框以释放内存?,其中一个答案提到del语句并不会删除一个实例,它只是删除了一个名称。

在答案中他们建议将数据框放入列表中,然后删除该列表:

lst = [pd.DataFrame(), pd.DataFrame(), pd.DataFrame()]
del lst  

如果我只想发布一个数据框,我需要将其放入一个列表中,然后像这样删除一个列表:
lst = [pd.DataFrame()]
del lst

我也看到了这个问题:如何释放Pandas DataFrame使用的内存? 有不同的答案,例如:
import gc
del df_1
gc.collect()

或者

在数据框的末尾使用

df = ""

还有更好的方法来实现吗?


您可能希望检查垃圾收集器。 - Sergey Bushmanov
1个回答

7
从你提供的原始链接中,你必须在列表中包含变量,然后删除该变量,再将列表删除。如果你只是添加到列表中,当你删除列表时,不会删除原始数据框。
import pandas
import psutil 
import gc
psutil.virtual_memory().available * 100 / psutil.virtual_memory().total
>> 68.44267845153809

df = pd.read_csv('pythonSRC/bigFile.txt',sep='|')
len(df)
>> 20082056

psutil.virtual_memory().available * 100 / psutil.virtual_memory().total

>> 56.380510330200195

lst = [df]
del lst

psutil.virtual_memory().available * 100 / psutil.virtual_memory().total
>> 56.22601509094238

lst = [df]
del df
del lst

psutil.virtual_memory().available * 100 / psutil.virtual_memory().total
>> 76.77617073059082

gc.collect()

>> 0


我还尝试了直接删除数据框并使用gc.collect(),结果也是一样的!
del df
gc.collect()
psutil.virtual_memory().available * 100 / psutil.virtual_memory().total
>> 76.59363746643066

然而,将DataFrame添加到列表并删除列表和变量的执行时间要比调用gc.collect()稍快一些。我使用time.time()来测量差异,gc.collect()几乎慢了整整一秒钟!
编辑:根据下方正确的评论,del dfdel [df]确实生成相同的代码。原始帖子和我的原始答案的问题是,一旦你给列表命名,例如lst=[df],你就不再引用原始的DataFrame了。
lst=[df] 
del lst

不同于:

del [df]

1
根据这个答案,上述内容是错误的:del dfdel [df]编译成完全相同的字节码。 - PLNech

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接