在Python中读取相当大的json文件

Tom*_*ick 74 python json

可能重复:
在python中加载大型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()
Run Code Online (Sandbox Code Playgroud)

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

我能干什么方式解决这个问题吗?

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

Gar*_*tty 76

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

编辑:另外值得一看- 卡希夫的评论有关json-streamer.

  • 我发现ijson在它流动之前需要完整的json - 我会更喜欢可以使用部分json的东西,因为它变得可用.找不到任何自己写的东西,它叫[jsonstreamer](https://github.com/kashifrazzaqui/json-streamer),可在[github]上找到(https://github.com/kashifrazzaqui/json-流光)和在cheeseshop (9认同)
  • @JeremyCraigMartinez看起来你只需要执行“with open(some_file) as file: for line in file: streamer.consume(line)”。拥有一个方便的方法(或者更好的是上下文管理器)是一件好事(并且请注意,对于手头的用例,依赖合理的换行符可能是一个坏主意 - 以块的形式读取文件按尺寸可能是更好的选择)。 (2认同)
  • 我还写了一个可以打开任何大小的JSON文件的库。我的lib加载了一个行为类似于常规dict或array的对象,但实际上,它仅在需要时才加载更多的东西。您可以从[Github](https://github.com/henu/bigjson)中查找。 (2认同)
  • @HenrikHeino;感谢您构建“bigjson”库。我的 json 文件包含多个对象,并且“json.load”或“bigjson.load”似乎适用于包含单个对象的 json 文件。对于具有多个对象的json文件,我们可以使用`json.loads`,但是`bigjson模块没有属性loads`。你能帮我吗? (2认同)