使用pandas和pickle的Python内存分配

使用pandas和pickle的Python内存分配,python,memory-management,memory-leaks,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.t

我正在运行一个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\u-str
没有释放内存(最初,我没有在代码中包含
del
语句,但我希望添加它可以解决问题——它没有)。在每次迭代过程中,数据帧中读取的数据量大致相同,约占我可用内存的3%;随着进程的迭代,每次迭代a都会报告
%MEM
(来自我的终端中的
ps u|grep[p]ython
),最终我的内存被淹没,进程被终止。我的问题是,我应该如何改变我的代码/方法,以便在每次迭代中释放上一次迭代的内存

注意,我通过Anaconda使用Python3.5.2运行Ubuntu 16.04


提前感谢您的指导

在python中,自动垃圾回收释放变量(DataFrame也是python中的另一个对象)。可以调整不同的垃圾收集策略(需要大量学习)

您可以使用

import gc
gc.collect()
但不鼓励频繁调用垃圾收集,因为这是一项成本高昂的操作,可能会影响性能


你是对的,你不需要
del
for循环中的变量,因为每次变量在循环中重新绑定时,旧对象的ref计数都会减少。它们在的
完成后挂起,但如果这在函数中,则该引用也会消失。我唯一的猜测是,
clean\u json\u to\u str
可能会做一些坏事,比如保留对象的背景引用。非常感谢@tdelaney的回答。我已经用
clean_json_to_str
步骤更新了我的问题,使之更加明确,并且诚实地告诉大家我在
del
调用中所做的一切(尽管,正如你提到的,这不应该是问题)。我创建了一个可以测试的代码版本,它没有显示出奇怪的内存消耗。您可能会遇到一些颠簸,因为底层堆在最初几次迭代中会扩展,并且有空的可用空间。但这是公平的,对我来说,内存并没有增加。为什么要pickle一个基于JSON的数据帧?pickle通常不占用内存,并且对于基于JSON的对象来说是冗余的。有关酸洗的详细信息,请参阅。我只想将清理后的JSON保存在另一个文本文件中,并在需要时使用
JSON
模块来读取它。@tdelaney感谢您的代码和研究。这对我来说真的很奇怪,我发现其行为方式与您的结果不一致。只有当简单的对象引用计数不足以确定是否需要删除时(例如,循环引用),才需要进行垃圾收集。OP不需要它,也不能解决问题。