使用 pandas 和 pickle 分配 Python 内存

标签 python memory-management memory-leaks

我正在运行一个 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()

但不鼓励频繁调用垃圾回收,因为这是一项代价高昂的操作,并且可能会影响性能。

Reference

关于使用 pandas 和 pickle 分配 Python 内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39984097/

相关文章:

python - ndb.toplevel 用于 python 方法与请求处理程序

python - 从 2D lat/lon 矩阵转换为 1D lat/lon 数组

optimization - GMSPolyline 非常大的内存峰值

c++ - 堆上的分配会影响访问性能吗?

python - 压缩由0和1组成的长向量

python - numpy 对数组段上的最大值进行向量化

python - 强制 sql_mode 为 "STRICT_TRANS_TABLES"仍然收到警告 Django

c++ - Googlemock 没有捕捉到泄露的对象

ios - 关于 ARC 内存泄漏和不正确递减的 Xcode Analyzer 问题

memory-leaks - 使用带有 Windows 换行符 (CR LF) 的行时,Camel netty TCP 客户端中的内存泄漏