从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]])
那么,怎么才能释放“data”这个变量占用的空间呢?
5 个回答
数据的 变量 其实并不占用什么实际的空间,它只是一个名字而已。而数据的 对象 则会占用一些空间,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
绑定到一个名字上。
考虑到这种细致的操作可能根本就没有必要,因为一旦你返回,这些引用就会消失,最多也只是暂时加快了速度。
在Python中,当变量不再被使用时,它们会自动被释放,所以你不需要太担心这个问题。不过,如果你真的想手动释放,可以使用
del data
需要注意的是,即使你使用了del
,垃圾回收器可能也不会立刻工作。这就是垃圾回收的一个缺点。你不能完全控制内存的管理。如果你想使用Python,这一点是需要接受的。你只需要相信垃圾回收器知道自己在做什么。
del data
如果你只有一个引用,这样做就可以了。记住,当当前的作用域结束时(也就是函数返回时),这个过程会自动发生。
另外,你不需要一直保留 jsonfile
这个字符串,你可以直接
data = json.load(open(input))
从文件中读取 JSON 数据。
如果你希望 data
在用完后立刻消失,你可以把这些操作结合起来:
for k,v in json.load(open(input))["specialKey"].iteritems():
因为循环结束后就没有对数据的引用了,所以 Python 会立即释放内存。