我正在加载一个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]])
你如何释放"数据"的空间?变量?
答案 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()强制垃圾收集将释放对象。