使用json.loads时出现Python分段错误--是否有另一种方法将JSON加载到列表中?

5

我正在尝试将一些JSON Twitter数据加载到列表中,但是却得到了"segmemtation 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终端窗口访问它。


3
有趣的是它崩溃而不是只是抛出异常。您能否在公共场所提供该文件?我真的很想看看它。 - viraptor
2
213MB很。你能把它放在某个地方供查看吗? - Veedrac
你使用的机器配置是什么? - ely
你用的是哪个版本的Python?机器配置如何? - Daenyth
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>')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接