使用json.loads时的Python分段错误 - 将JSON加载到列表中的替代方法?

时间:2014-06-10 13:09:36

标签: python json

我正在尝试将一些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 Streaming API在大约10天内收集数据,大小为213M。

机器规格:

  • Oracle VM Virtual Box
  • 操作系统:Ubuntu(64位)
  • 基本内存:1024 MB
  • 视频内存:128 MB
  • 存储(虚拟大小):8.00 GB动态分配

我正在使用iPython(版本2.7.6),并通过Linux终端窗口访问它。

1 个答案:

答案 0 :(得分: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>')