如何存储和查询5000万个简单的Python dict?

2024-05-16 18:03:48 发布

您现在位置:Python中文网/ 问答频道 /正文

问题

每个dict都有一个唯一的数字id字段,但其余的都是可变的(尽管都是文本或数字值)。一些简单的查询功能是不错的,例如get where name contains 'abc'或{}。在

我有什么选择?在

设置

  • Python 2.6
  • 32位Ubuntu服务器256MB
  • 单机
  • 不交换

示例dict:

{'id': 3823942, 'name': u'example', 'unknown_variable_key': u'foo'}

注释

无法使用MongoDB:32位MongoDB进程的数据量限制在2.5gb左右
无法使用Redis,因为它需要RAM中的整个数据集


Tags: name文本功能服务器id示例getubuntu
3条回答

Pytables可能是您的一个选择http://www.pytables.org/moin

由于数据集太大而不能全部存储在内存中,因此很可能仅限于使用磁盘的解决方案。最简单的存储方法是序列化dict并将其存储为文件,您可以对索引进行一些简单的优化,这样就不必在查询中搜索整个数据集。如果您有权访问第三方数据库(mysql甚至sqlite3),您可以将字典存储到一个包含id、key、value列的表中(因此每个dict映射到表中的多行),并为查询创建id和key索引。在

你可以尝试使用CouchDB。它是一个面向文档的数据库。有一些例子(例如here)可以存储数百万个以上的文档。在

有一个good guide到CouchDB。在

您的数字id字段可以用作文档id

您可以尝试编写一个python脚本,使用bulk APIs填充数据库(以加快插入该数量的对象)

视图可用于进行各种查询。在

[编辑]

我对CouchDB的内存消耗很好奇,做了一个简单的实验。在

我在一个空数据库中插入了5万个文档。在我的代码组合MacBook上花了大约15-20分钟。在插入期间,CouchDB进程在一个块中插入50k个文档时的最大内存消耗为120MB,而在插入25k个块时消耗的内存大约为60MB。在

最终数据库大小约为1.2GB。空闲CounchDB进程的内存消耗是40MB。获取单个文档是即时的(使用Futon web前端)。在

我插入了以下格式的文档(用Python生成的JSON):

'{"_id" : "%09d", "name" : "example", "field%d" : "hello"}' % 
    (num, random.randint(0, 100))

或者

^{pr2}$

_id用作键,文档按该键排序。在

关于您提供的示例查询。因为通常需要遍历整个文档集才能获得结果,所以效率不高。但在创建特殊视图后,两者都可以进行优化。在

相关问题 更多 >