我最近选择了Python编程,正在创建数据库。
我已经开始从源代码中提取所有这些文件,因此它们都在我计算机上的目录中。
所有这些文件的结构都是相同的,我想要做的就是搜索这些多维字典并找到一组特定键的值。
这些json文件的结构类似,
{
"userid": 34535367,
"result": {
"list": [
{
"name": 264,
"age": 64,
"id": 456345345
},
{
"name": 263,
"age": 42,
"id": 364563463456
}
]
}
}
在我的情况下,我想搜索“name”键并返回数千个名称的相关数据(质量,id和原始用户ID),就像我的数百万个JSON文件一样。
基本上我对此非常陌生,我所拥有的一点编程知识都是Python。我很高兴开始学习我需要的任何东西,但我不确定要去哪个方向。
答案 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以对数方式进行二进制搜索。但我仍然建议使用适当的数据库,因为维护索引会比执行某些插入/删除更麻烦。