【发布时间】: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 这只是一个命令行生产力实用程序,而不是作为服务运行的东西,所以我希望它尽可能少地依赖。