【问题标题】:What is the best way to search millions of JSON files?搜索数百万 JSON 文件的最佳方法是什么?
【发布时间】:2013-11-11 18:47:54
【问题描述】:

我最近开始使用 Python 进行编程,并且正在创建一个数据库。

我已经设法从源中提取所有这些文件,因此它们都在我计算机上的一个目录中。

所有这些文件的结构都相同,我想做的是搜索这些多维字典并找到一组特定键的值。

这些json文件的结构都差不多,

{
"userid": 34535367,
"result": {
    "list": [
        {
            "name": 264,
            "age": 64,
            "id": 456345345
        },
        {
            "name": 263,
            "age": 42,
            "id": 364563463456
        }
    ]
}

}

就我而言,我想从数百万个 JSON 文件中搜索“名称”键并返回数千个名称的相关数据(质量、ID 和原始用户 ID)。

基本上我在这方面很陌生,我所掌握的一点编程知识都在 Python 中。我很高兴开始学习我需要的任何东西,但我不确定该往哪个方向发展。

【问题讨论】:

  • 这些数据存在于数百万个 JSON 文件中而不是适当的数据库中,有什么理由吗?
  • 我不得不通过 Web API 调用所有这些,现在我有 200 万个文件,可能过滤掉了 1 亿个选项。
  • 根据您查询和更新数据的频率,最好将它们插入数据库中。
  • 您需要稍后获取更多数据,还是数据集现在已经完成?
  • 哦,好吧,我必须经常访问它,是的,有什么关于最好学习的数据库的建议吗?我将获取数百万条数据

标签: python mysql database json


【解决方案1】:

如果您的目标是创建数据库,那么您应该了解数据库的工作原理并解决您现在尝试解决的相同问题:)

NoSQL 数据库(如 mangodb)也可以处理 json 文档,并且很可能实现了一整套工具来搜索和过滤文档。

现在回答您的问题,除非您进行一些预处理,否则没有快速的方法可以做到这一点,这意味着您存储有关数据的不同信息(称为元数据)。 这是一个庞大的主题,我没有足够的专业知识来为您提供所有答案,但我可以给您一个简单的提示:使用索引。

索引是一个排序的键/值映射,对于每个值,我们存储包含该值的文档(或 Json 文档的文件 + 位置)。例如 name 属性的索引如下所示:

{
263: ('jsonfile10.json', '0')
264: ('jsonfile10.json', '30'), 
# The json document can be found on the jsonfile10.json file on line 30
}

通过为查询最多的值保留索引,您可以将线性时间搜索变成对数时间搜索,更不用说插入新文档的速度要快得多。在您的情况下,您似乎只需要 name 字段上的索引。

在您插入、更新或删除文档时完成创建/更新索引。使用平衡二叉树可以加速索引的更新。

【讨论】:

    【解决方案2】:

    作为建议,您为什么不直接处理所有传入的文件并将数据插入数据库?您将拥有一个工具集来查询该数据库。例如 SQLite 会做(以及任何其他更复杂的数据库): http://www.sqlite.org/ http://docs.python.org/2/library/sqlite3.html

    其他简单的解决方案可能是构建文件映射name_id to /file/path。然后您可以通过名称 id 对数进行二进制搜索。但我仍然建议使用适当的数据库,因为维护索引会比进行一些插入/删除更麻烦。

    【讨论】:

    • 使用另一个数据库创建数据库似乎是多余的:)
    • @lcfseth 他现在没有任何数据库。只是 json 文件。
    • 说实话,我并没有真正想到这一点,我仍然只是在学习所有选项。我无权仅下载整个数据库,因此创建另一个数据库可能是可行的方法。我只是想出了第一步,获取数据。第 2 步,搜索数据,但我开始看到可能性
    • 如果您只需要获取数据并进行搜索,那么您应该使用 NoSQL 数据库。他们已经将文档存储为 JSON,因此您甚至不必进行处理或类似的事情(与 SQL 数据库不同):)
    • 那么 NoSQL 数据库将允许我在名称中搜索匹配值,然后返回所有相关数据? (用户 ID、年龄、ID)
    猜你喜欢
    • 1970-01-01
    • 2015-04-02
    • 2021-06-26
    • 2015-08-14
    • 1970-01-01
    • 2016-08-21
    • 2015-12-31
    • 1970-01-01
    • 2014-03-25
    相关资源
    最近更新 更多