在Python中读取4.8gbjson文件

2024-10-01 11:41:19 发布

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

import json

with open("reverseURL.json") as file:
    file2 = json.load(file)

eagle = file2["eagle"]

sky = file2["sky"]

eagleAndSky = set(eagle).intersection(sky)

print(eagleAndSky.pop())

print(eagleAndSky.pop())

我试图用一个4.8gbs的json文件来运行这段代码,但是每次我运行它,它都会冻结我的计算机,我不知道该怎么做。json文件包含在照片中用作键的标记,对于属性,它们是包含该标记的图像url。当我在从测试和验证集创建的json文件上运行它时,这个程序可以工作,因为它们很小,但是当我在训练集中的json文件上运行它时,它会冻结我的计算机,因为这个文件很大,比如4.8gb。在


Tags: 文件标记importjson计算机withopenpop
1条回答
网友
1楼 · 发布于 2024-10-01 11:41:19

得到的答案最简单。得到足够的空间来保存解析后的JSON,你就有了两个集合,你的算法将再次变得更快。在

如果买更多的内存是不可能的,你将需要制定一个算法,而不是像饥饿的内存。作为第一步,考虑使用像ijson这样的热气腾腾的JSON解析器。这将允许您只在内存中存储您关心的文件片段。假设您在eaglesky中有很多重复项,单独执行此步骤可能会减少内存使用量,从而再次快速运行。下面是一些代码来说明,您必须运行pip install ijson才能运行它:

from ijson import items

eagle = set()
sky = set()
with open("reverseURL.json") as file:
    for o in items(file, "eagle"):
        eagle.update(o)
    # Read the file again
    file.seek(0)
    for o in items(file, "sky"):
        sky.update(o)

eagleAndSky = eagle.intersection(sky)

如果使用ijson将json解析为steam并不能降低内存使用率,那么您必须将临时状态存储在磁盘上。Pythonsqlite3模块非常适合这种类型的工作。您可以创建一个临时文件数据库,其中一个表用于eagle,一个表用于sky,将所有数据插入到每个表中,添加一个唯一索引以删除重复数据(并在下一步中加快查询速度),然后连接这些表以获得交集。下面是一个例子:

^{pr2}$

相关问题 更多 >