J.C*_*man 7 python memory pandas
我正在 pandas 中运行一个很长的 ETL 管道。我必须创建不同的 pandas 数据帧,并且我想释放某些数据帧的内存。
我一直在阅读如何释放内存,我发现运行此命令不会释放内存:
del dataframe
Run Code Online (Sandbox Code Playgroud)
点击此链接:如何从内存中删除多个 pandas (python) 数据帧以节省 RAM?,答案之一说 del 语句不会删除实例,它只是删除一个名称。
在答案中,他们说将数据帧放入列表中,然后删除列表:
lst = [pd.DataFrame(), pd.DataFrame(), pd.DataFrame()]
del lst
Run Code Online (Sandbox Code Playgroud)
如果我只想释放一个数据帧,我需要将其放入一个列表中,然后删除一个列表,如下所示:
lst = [pd.DataFrame()]
del lst
Run Code Online (Sandbox Code Playgroud)
我也看到了这个问题:How do Irelease memoryused by a pandas dataframe?
有不同的答案,例如:
import gc
del df_1
gc.collect()
Run Code Online (Sandbox Code Playgroud)
或者
就在数据框使用结束时
df = ""
Run Code Online (Sandbox Code Playgroud)
或者有更好的方法来实现这一目标?
Bru*_*701 10
从您包含的原始链接中,您必须在列表中包含变量,删除变量,然后删除列表。如果您只是添加到列表中,那么当您删除列表时,它不会删除原始数据框。
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
Run Code Online (Sandbox Code Playgroud)
我也尝试删除数据框并使用 gc.collect() 得到相同的结果!
del df
gc.collect()
psutil.virtual_memory().available * 100 / psutil.virtual_memory().total
>> 76.59363746643066
Run Code Online (Sandbox Code Playgroud)
但是,将数据帧添加到列表以及删除列表和变量的执行时间比调用要快一些gc.collect()。我曾经 time.time()测量过差异,gc.collect()结果慢了几乎整整一秒!
编辑:
根据下面的正确注释,del df确实del [df]生成了相同的代码。原始帖子的问题以及我最初的答案是,一旦您为列表指定名称(如 中所示)lst=[df],您就不再引用原始数据框。
lst=[df]
del lst
Run Code Online (Sandbox Code Playgroud)
不等于:
del [df]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
25117 次 |
| 最近记录: |