搜索数百万个JSON文件的最佳方法是什么?

时间:2013-10-31 16:35:39

标签: python mysql database json

我最近选择了Python编程,正在创建数据库。

我已经开始从源代码中提取所有这些文件,因此它们都在我计算机上的目录中。

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

这些json文件的结构类似,

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

}

在我的情况下,我想搜索“name”键并返回数千个名称的相关数据(质量,id和原始用户ID),就像我的数百万个JSON文件一样。

基本上我对此非常陌生,我所拥有的一点编程知识都是Python。我很高兴开始学习我需要的任何东西,但我不确定要去哪个方向。

2 个答案:

答案 0 :(得分: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
}

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

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

答案 1 :(得分:1)

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

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