【问题标题】:Iteratively parse JSON file迭代解析 JSON 文件
【发布时间】:2014-01-20 01:39:33
【问题描述】:

我有 1000 多个类似的 JSON 文件

{
    "name": "Some name",
    "part_num": "123456",

    "other_config": {
        // Large amount of objects
    },
    "some more": {
        // Large amount of objects
    }
    // etc
}

当我的程序启动时,它必须扫描包含所有这些 JSON 文件的目录,加载每个文件,然后提取 "name""part_num" 值并使用这些值填充列表视图。然后用户选择一个,然后重新解析该配置并采取适当的操作。

问题是读取很多文件需要一段时间。我通过使用multiprocessing 将工作放在后台的所有可用内核上,然后在完成后填充列表视图来稍微减轻它,但我仍然受到 IO 的限制。因为我知道这段代码会在处理器和硬盘比我慢的计算机上运行,​​所以这个速度是不可接受的。

平均情况是我需要的值位于文件的开头,但我不能假设在最坏的情况下。 有没有办法迭代解析 JSON 文件,以便我可以更快地从这些文件中加载我需要的内容?

我可以求助于正则表达式,but I'd really prefer not to

【问题讨论】:

  • 或者你可以将它们合并成一个单一的 jsons 结构,例如一个数据数组,[{stuff from file1},{stuff from file2},....],所以你只加载一个文件并解析一个 js 结构......或者只使用一个数据库
  • 不使用 JSON 文件?例如,为什么不对这些数据使用sqlite 数据库?如果需要,只需扫描文件一次
  • 我建议寻找解决方案,而不是在每次程序启动时解析所有这些文件。也许将结果缓存在数据库中,然后只打开自上次启动以来添加或更改的文件?
  • 来这里说的。构建单个数据库或文件(好像文件本身不能成为数据库),然后使用这个。当然只把搜索相关的信息放在这样一个文件里(namepart_num
  • @MarcB 要求说不。每个文件代表一个不同的产品,我们希望将这些产品彼此分开。非程序员可能不得不编辑这些文件,如果他们不小心编辑了文件的错误部分,那将是一场灾难。

标签: python json


【解决方案1】:

ijson 以 pythonc 方式执行迭代 json 解析。

我想你的问题的解决方案是:

import ijson

f = open('...')
objects = ijson.items(f, 'other_config.item')
for part in objects:
    do_something_with(part)

免责声明我没有使用那个库。

【讨论】:

    【解决方案2】:

    这让我想起了当时的 XML,当时我们有三种类型的解析器:基于 DOM、基于事件(例如 SAX)和鲜为人知的基于拉的(例如 StAX)。后两者效率更高,因为当您只需要部分文件时,它们不需要将整个文件加载到内存中。

    幸运的是,JSON 也存在类似的情况。对于 Python,请查看 yajl-py,它是 C 库 Yajl 的 Python 包装器。

    通过基于事件的解析器进行解析需要更多代码,但效率更高。

    【讨论】:

      【解决方案3】:

      YAJL 是一个带有Python bindings 的事件驱动解析器。这样,您可以在检索到所需信息后停止解析。

      【讨论】:

      • 这看起来可能是一个很好的解决方案。如果它符合我的需要,并且我可以清楚地在这个项目中使用它,我稍后会更新你。
      • 我喜欢这个项目的外观,但它看起来不适用于我的情况。你知道其他可以做同样事情的库吗?
      • 回答说最好知道为什么 YAJL 不适合你。
      猜你喜欢
      • 2019-04-07
      • 1970-01-01
      • 1970-01-01
      • 2021-01-03
      • 1970-01-01
      • 2012-07-09
      • 2011-10-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多