106

可能重复:
是否有一种内存高效且快速的方式来加载大型 JSON 文件?

所以我有一些相当大的 json 编码文件。最小的是 300MB,但这是迄今为止最小的。其余的是多 GB,从大约 2GB 到 10GB+ 不等。

因此,在尝试使用 Python 加载文件时,我似乎内存不足。我目前正在运行一些测试,以大致了解处理这些东西需要多长时间才能看到从这里开始的地方。这是我用来测试的代码:

from datetime import datetime
import json

print datetime.now()

f = open('file.json', 'r')
json.load(f)
f.close()

print datetime.now()

毫不奇怪,Python 给了我一个 MemoryError。似乎 json.load() 调用了 json.loads(f.read()),它试图首先将整个文件转储到内存中,这显然是行不通的。

有什么办法可以干净地解决这个问题吗?

我知道这是旧的,但我不认为这是重复的。虽然答案是一样的,但问题是不同的。在“重复”中,问题是如何有效地读取大文件,而这个问题处理的文件甚至根本不适合内存。效率不是必需的。

4

1 回答 1

108

这里的问题是,JSON作为一种格式,一般都是先完整解析,然后在内存中处理,对于如此大量的数据,这显然是有问题的。

对此的解决方案是将数据作为流处理 - 读取文件的一部分,使用它,然后重复。

最好的选择似乎是使用ijson之类的东西- 一个将 JSON 作为流而不是块文件使用的模块。

编辑:也值得一看 - kashif 的评论json-streamerHenrik Heino 的评论bigjson.

于 2012-04-30T10:44:52.900 回答