我正在运行一个 Python 脚本,可以粗略地概括为如下(半伪代码):
import pandas as pd
for json_file in json_files:
with open(json_file,'r') as fin:
data = fin.readlines()
data_str = '[' + ','.join(x.strip() for x in data) + ']'
df = pd.read_json(data_str)
df.to_pickle('%s.pickle' % json_file)
del df, data, data_str
该过程通过迭代创建数据框,并将每个数据框保存到一个唯一的文件中。然而,在该过程中我的内存似乎被使用完了,就好像
del df, data, data_str
不会释放内存(最初,我没有在代码中包括del
语句,但我希望添加它可以解决这个问题——但实际上并没有)。在每次迭代中,大约相同数量的数据被读入数据框,大约占用我可用内存的3%;随着进程的迭代,每次迭代都会报告%MEM
的3%增加(从我的终端中的ps u | grep [p]ython
),最终我的内存被淹没,进程被杀死。我的问题是,我应该如何改变我的代码/方法,以便在每次迭代时,前一次迭代的内存得到释放?需要注意的是,我正在运行Ubuntu 16.04,使用Anaconda下的Python 3.5.2。
感谢您提前的指导。
for
循环中不需要使用del
删除变量,因为每次变量在循环中重新绑定时,旧对象的引用计数都会减少。它们在for
完成后仍然存在,但如果这是在函数中,那么该引用也会消失。我唯一的猜测是clean_json_to_str
可能会做一些坏事,比如保留对对象的后台引用。 - tdelaneyclean_json_to_str
步骤,并坦诚地说明了我在del
调用中所做的一切(尽管,正如您所提到的,这不应该是问题所在)。 - Tom