0

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

我已经从源代码中提取了所有这些文件,因此它们都位于我计算机上的一个目录中。

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

这些 json 文件的结构都类似,

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

}

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

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

4

2 回答 2

2

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

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 字段上的索引。

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

于 2013-10-31T16:51:58.060 回答
1

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

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

于 2013-10-31T16:40:50.740 回答