Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:ijson.parse(在_文件中)vs json.load(在_文件中)_Python_Json_Parsing_Large Files_Ijson - Fatal编程技术网

Python:ijson.parse(在_文件中)vs json.load(在_文件中)

Python:ijson.parse(在_文件中)vs json.load(在_文件中),python,json,parsing,large-files,ijson,Python,Json,Parsing,Large Files,Ijson,我正在尝试用python读取一个大的JSON文件(~2GB) 下面的代码在小文件上运行良好,但在大文件上不起作用,因为第二行有MemoryError in_file = open(sys.argv[1], 'r') posts = json.load(in_file) 我看了一下,几乎每个人都建议使用ijson,所以我决定试试 in_file = open(sys.argv[1], 'r') posts = list(ijson.parse(in_file)) 这处理了读取大文件的问题,但是

我正在尝试用python读取一个大的JSON文件(~2GB)

下面的代码在小文件上运行良好,但在大文件上不起作用,因为第二行有MemoryError

in_file = open(sys.argv[1], 'r')
posts = json.load(in_file)
我看了一下,几乎每个人都建议使用ijson,所以我决定试试

in_file = open(sys.argv[1], 'r')
posts = list(ijson.parse(in_file))
这处理了读取大文件的问题,但是ijson.parse没有像JSON.load那样返回JSON对象,因此我的其余代码无法工作

TypeError:元组索引必须是整数或切片,而不是str

如果我在使用json.load时打印“posts”,o/p看起来就像一个普通的json

[{"Id": "23400089", "PostTypeId": "2", "ParentId": "23113726", "CreationDate": ... etc
如果在使用ijson.parse后打印“posts”,则o/p看起来像一个散列映射

[["", "start_array", null], ["item", "start_map", null], 
 ["item", "map_key", "Id"], ["item.Id", "string ... etc
我的问题:
我不想更改其余的代码,因此我想知道是否有任何方法可以将
ijson.parse(在_文件中)
的o/p转换回JSON对象,以便它与我们使用
JSON.load(在_文件中)

的情况完全相同。这可能适合您:

in_file = open(sys.argv[1], 'r')
posts = []
data = ijson.items(in_file, 'item')
for post in data:
    posts.append(post)

不。RAM的数量是你的问题-如果你不能立即将结构加载到内存中,即使你使用ijson,你也不能有类似的接口。有可能逐行读取对象的文件来解决RAM问题吗?这是Python3还是Python2,出于好奇?我很好奇3在json编码器或解释器内存管理中是否有一些优化。它是python 3。我已经试了几天来解决这个问题。我几乎在不同的论坛上尝试了所有发布的解决方案,但仍然无法将ijson.parse(在_文件中)的o/p转换为json.load(在_文件中)的相同结构。您是否尝试过
io.StringIO
,或任何
io
流媒体接口?特别是缓冲流的东西?位于的json解码器文档在第一个示例中显示了一个示例。使用以下行:
from io import StringIO
io=StringIO()
json.dump(['streaming API',io)
io.getvalue()
。看起来您可以为读取设置缓冲区大小,这可能会让您绕过文件大小问题。