从JSON加载数据后清理内存

2 投票
5 回答
4745 浏览
提问于 2025-04-17 01:05

我正在加载一个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]])

那么,怎么才能释放“data”这个变量占用的空间呢?

5 个回答

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 绑定到一个名字上。

考虑到这种细致的操作可能根本就没有必要,因为一旦你返回,这些引用就会消失,最多也只是暂时加快了速度。

1

在Python中,当变量不再被使用时,它们会自动被释放,所以你不需要太担心这个问题。不过,如果你真的想手动释放,可以使用

del data

需要注意的是,即使你使用了del,垃圾回收器可能也不会立刻工作。这就是垃圾回收的一个缺点。你不能完全控制内存的管理。如果你想使用Python,这一点是需要接受的。你只需要相信垃圾回收器知道自己在做什么。

1
del data

如果你只有一个引用,这样做就可以了。记住,当当前的作用域结束时(也就是函数返回时),这个过程会自动发生。

另外,你不需要一直保留 jsonfile 这个字符串,你可以直接

data = json.load(open(input))

从文件中读取 JSON 数据。

如果你希望 data 在用完后立刻消失,你可以把这些操作结合起来:

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

因为循环结束后就没有对数据的引用了,所以 Python 会立即释放内存。

撰写回答