使用json.loads时Python出现段错误——有其他方法将JSON加载到列表中吗?

5 投票
1 回答
1977 浏览
提问于 2025-04-18 09:17

我正在尝试把一些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>')

撰写回答