使用json.loads时Python出现段错误——有其他方法将JSON加载到列表中吗?
我正在尝试把一些Twitter的JSON数据加载到一个列表里,但结果却出现了segmentation fault (core dumped)
的错误。
虽然我很想升级我的内存,但现在这并不是一个可行的选择。我想知道有没有办法可以逐步处理这个列表,而不是试图一次性把所有数据都加载到内存里?或者有没有其他的解决办法,可以让我把这些JSON数据加载到列表中?
In [1]: import json
In [2]: data = []
In [3]: for i in open('tweets.json'):
...: try:
...: data.append(json.loads(i))
...: except:
...: pass
...:
Segmentation fault (core dumped)
这些数据是通过Twitter的流式API在大约10天内收集的,大小为213M。
机器配置:
- Oracle VM Virtual Box
- 操作系统:Ubuntu(64位)
- 基础内存:1024 MB
- 显存:128 MB
- 存储(虚拟大小):动态分配的8.00 GB
我正在使用iPython(版本2.7.6),并通过Linux终端窗口访问它。
1 个回答
1
在几乎所有现代计算机上,213MB的文件非常小,轻松就能放进内存里。我在普通的现代计算机上加载过更大的推特数据集。不过,也许你(或者以后看到这个内容的其他人)并不是在使用现代计算机,或者你的现代计算机内存特别小。
如果真的是数据的大小导致了程序崩溃,你可以试试ijson这个模块,它可以让你逐块读取JSON文档。
下面是这个项目页面上的一个例子:
import ijson
parser = ijson.parse(urlopen('http://.../'))
stream.write('<geo>')
for prefix, event, value in parser:
if (prefix, event) == ('earth', 'map_key'):
stream.write('<%s>' % value)
continent = value
elif prefix.endswith('.name'):
stream.write('<object name="%s"/>' % value)
elif (prefix, event) == ('earth.%s' % continent, 'end_map'):
stream.write('</%s>' % continent)
stream.write('</geo>')