【问题标题】:Python: query performance on JSON vs sqlite?Python:JSON 与 sqlite 的查询性能?
【发布时间】:2020-09-22 17:45:44
【问题描述】:

我有一个格式如下的 JSON 文件:

{
  "items": {
     "item_1_name": { ...item properties... }
     "item_2_name": { ...item properties... }
     ...
  }
}

根据我的最后统计,JSON 文件中存储的项目可能超过 13K,而文件本身在磁盘上的大小接近 75MB。

现在,我有一个程序需要查询(只读)数据。每个查询操作都需要一个项目名称,并且需要读取其属性。该程序的每次调用可能涉及从几个到几十个查询操作。

当然,从磁盘加载JSON文件并解析需要时间和空间:加载和解析需要0.76秒,解析后的数据需要197 MB的内存。这意味着在每次调用该程序时,我需要先等待近一秒钟,然后它才能对结果执行任何其他操作。我想让程序响应更快。

所以我有另一种方法:从那个 JSON 文件创建一个 SQLite 数据库文件。之后,程序需要查询数据库,而不是查询直接从 JSON 文件中解析出来的数据。

但是,SQLite 方法有一个缺点:与 json.load() 不同,它不会解析整个文件并将其保存在内存中(假设缓存未命中),而且我不确定花费的时间是否查询操作遇到的磁盘 IO 可能会抵消不使用 JSON 方法的好处。

所以我的问题是:根据您的经验,这个用例是否适合 SQLite?

【问题讨论】:

  • 当我不得不做类似的事情时,虽然使用 XML,而不是 JSON,但我确实创建了一个 SQLite DB。基本原理是,为了对数据执行几个查询,您需要读取的 SQLite DB 的比例远小于读取整个 JSON/XML 所需的比例。我没有比较性能,但我使用 SQLite 得到的结果令人满意。
  • sqlite 是一个数据库,您所描述的内容听起来与数据库的用途完全一样……但对于您的特定用例,唯一真正的答案是实际分析它。我会注意到,除了将 JSON 解析为嵌套字典的开销之外,您不会比几个哈希查找快得多。但同样,您需要检查并查看。
  • 这取决于您的用例。使用真正的数据库(mysql,postgres,像redis这样的“内存数据库”)是否有任何限制,这就是它们的用途。我认为 PyPy 会比 cpython 快得多。
  • @MauriceMeyer 这只是一个命令行生产力实用程序,而不是作为服务运行的东西,所以我希望它尽可能少地依赖。

标签: python json sqlite


【解决方案1】:

我认为这完全取决于您查询数据的方式。从您描述它的方式来看,您仅通过 ID 进行查询,因此您无法充分利用 sqlite 通过效率提供的功能。它应该适用于您的用例,但它会擅长返回与值匹配的所有记录、值在两个整数之间的所有记录等。值得考虑的第三个选项是最小键/值存储,例如存储的 python 字典作为pickle 或非常简单的redis 服务。这两者都将允许通过 ID 查询比读取大的 json 字符串更快。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-30
    • 2017-08-07
    • 1970-01-01
    • 2020-08-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多