从JSON加载数据后清理内存

时间:2011-09-01 14:57:19

标签: python json

我正在加载一个JSON文件来解析它并将它(只是JSON的一部分)转换为CSV。 所以在方法结束时,我将释放加载的JSON的空间。

以下是方法:

def JSONtoCSV(input,output):
   outputWriter = csv.writer(open(output,'wb'), delimiter=',')
   jsonfile = open(input).read()
   data = loads(jsonfile)

   for k,v in data["specialKey"].iteritems():
      outputWriter.writerow([v[1],v[5]])

你如何释放"数据"的空间?变量?

5 个答案:

答案 0 :(得分:1)

在Python中,变量在超出范围时会自动释放,因此您不必担心它。但是,如果您真的想要,可以使用

del data

有一点需要注意的是,即使您使用del,垃圾收集器也可能不会立即启动。这是垃圾收集的缺点。您只是没有100%的内存管理控制权。如果您想使用Python,那么您需要接受这一点。你只需要相信垃圾收集器就知道它在做什么。

答案 1 :(得分:1)

数据变量不会占用任何有意义的空间 - 它只是一个名称。数据对象占用一些空间,Python不允许您手动释放对象。在没有引用它们之后的某个时间,对象将被垃圾收集。

为了确保您不会让事情保持比您想要的更长的时间,请确保您没有办法访问它们(没有名称仍然绑定它们等)。

改进的实施可能是

def JSONtoCSV(input_filename, output_filename):
    with open(input_filename) as f:
        special_data = json.load(f)[u'specialKey']

    with open(output_filename,'wb') as f:
        outputWriter = csv.writer(f, delimiter=',')
        for k, v in special_data.iteritems():
            outputWriter.writerow([v[1], v[5]])

这不会存储您调用的jsonfile字符串或您调用的data字典,因此一旦Python需要它们就会被释放。之前的改进是使用json.load而不是json.loads来完成的,它采用文件对象本身。后一项改进是通过立即查找'specialKey'而不是将名称绑定到所有data来实现的。

考虑到这种微妙的舞蹈可能根本就没有必要,因为一旦你回来,这些引用将不复存在,你最多只能暂时加速。

答案 2 :(得分:0)

del data
如果你只有一个参考,

应该这样做。请记住,当当前范围结束时(函数返回),这将自动发生。

此外,您不需要保留jsonfile字符串,只需

即可
data = json.load(open(input))

直接从文件中读取JSON数据。

如果您希望data在完成后立即消失,您可以将所有这些结合起来:

for k,v in json.load(open(input))["specialKey"].iteritems():

由于循环结束后没有对数据的引用,Python将立即释放内存。

答案 3 :(得分:0)

Python是一种垃圾收集语言,因此一旦使用它就不必担心释放内存;一旦jsonfile变量超出范围,解释器就会自动释放它。

如果您确实想要删除该变量,则可以使用del jsonfile,如果您在删除后尝试引用该错误,则会导致错误。但是,除非您正在加载足够的数据以导致性能显着下降,否则我会将其留给垃圾收集器。

答案 4 :(得分:0)

请参阅Python json memory bloat。由于不满足阈值,垃圾收集不会被踢入。因此即使del调用也不会释放内存。但是,使用gc.collect()强制垃圾收集将释放对象。