我正在运行一个 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
(来 self 的终端中的 ps u | grep [p]ython
)有 3% 的提升,最终是我的内存被淹没,进程被杀死。我的问题是我应该如何更改我的代码/方法,以便在每次迭代时释放前一次迭代的内存?
请注意,我通过 Anaconda 运行 Ubuntu 16.04 和 Python 3.5.2。
预先感谢您的指导。
最佳答案
在 python 中,自动垃圾回收会释放变量(pandas DataFrame 也只是 python 中的另一个对象)。可以调整不同的垃圾收集策略(需要大量学习)。
您可以使用手动触发垃圾回收
import gc
gc.collect()
但不鼓励频繁调用垃圾回收,因为这是一项代价高昂的操作,并且可能会影响性能。
关于使用 pandas 和 pickle 分配 Python 内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39984097/