【发布时间】:2013-10-10 02:37:01
【问题描述】:
基本上,我有一个 6.4GB 的 XML 文件,我想将其转换为 JSON,然后将其保存到磁盘。我目前正在运行带有 i7 2700k 和 16GB 内存的 OSX 10.8.4,并运行 Python 64 位(双重检查)。我收到一个错误,我没有足够的内存来分配。我该如何解决这个问题?
print 'Opening'
f = open('large.xml', 'r')
data = f.read()
f.close()
print 'Converting'
newJSON = xmltodict.parse(data)
print 'Json Dumping'
newJSON = json.dumps(newJSON)
print 'Saving'
f = open('newjson.json', 'w')
f.write(newJSON)
f.close()
错误:
Python(2461) malloc: *** mmap(size=140402048315392) failed (error code=12)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug
Traceback (most recent call last):
File "/Users/user/Git/Resources/largexml2json.py", line 10, in <module>
data = f.read()
MemoryError
【问题讨论】:
-
尝试
readlines而不是read。read方法返回一个字符串,一个字符串在内存中占用 连续 空间,并且内存中通常没有大的 (> 100mb) 连续空间可用。readlines将为您提供字符串列表,这对于大数据来说效果相对较好。 -
对于这样的事情,python 的内存开销往往有点高......例如:
from lxml import etree; e = etree.Element('x'); e.__sizeof__()为或多或少的空元素返回 0x30 - 48 字节。d = dict(); d.__sizeof__()返回 0xf8。然后,您正在读取 xml,然后将其重新创建为 dict,基本上将其内存使用量增加了一倍。你必须找到一种增量方法。 -
这里的一个谜是为什么
mmap报告要求的大小是 140,402,048,315,392。是的,这是一个大文件,但即使是 Python ;-) 应该认为它需要 140 万亿字节。