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

2024-09-29 20:29:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图将一些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天内收集的,数据大小为2.13亿。在

机器规格:

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

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


Tags: 数据方法内存incorejson列表data
1条回答
网友
1楼 · 发布于 2024-09-29 20:29:06

在几乎所有现代机器上,213MB的文件都非常小,很容易放入内存中。我已经在普通的现代机器上把更大的tweet数据集加载到内存中。但也许你(或其他人稍后阅读本文)并不是在现代机器上工作,或者它是一台内存容量特别小的现代机器。在

如果确实是数据的大小导致了分段错误,那么您可以尝试使用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>')

相关问题 更多 >

    热门问题