如何存储和查询5000万个简单的Python字典?
问题
每个字典都有一个独特的数字ID字段,但其他字段的内容是可变的(可以是文本或数字)。如果能有一些简单的查询功能就好了,比如 get where name contains 'abc'
或者 where a < 123
。
我有哪些选择呢?
环境设置
- Python 2.6
- 32位的Ubuntu服务器,内存256MB
- 单台机器
- 没有交换空间
示例字典:
{'id': 3823942, 'name': u'example', 'unknown_variable_key': u'foo'}
备注
不能使用MongoDB:32位的MongoDB进程最多只能处理大约2.5GB的数据
不能使用Redis,因为它需要将整个数据集放在内存中
5 个回答
Pytables可能是一个适合你的选择,详细信息可以查看这个链接:http://www.pytables.org/moin
试试使用littletable吧。它可以处理一堆对象,自动从对象的属性中推断出列名,还支持简单的查询、连接和数据透视表操作。一个很不错的地方是,查询和连接操作的结果都是新的、完整的、可以查询的littletable。
littletable还没有引起太多关注或使用,所以我很想听听你对它的反馈或使用体验。
你可以试试CouchDB。这是一种面向文档的数据库。这里有一些例子(比如在这里),展示了如何存储上百万个文档。
还有一本不错的指南,可以帮助你了解CouchDB。
你的数字ID字段可以用作文档的ID。
你可以尝试写一个Python脚本,通过批量API来填充数据库,这样可以更快地插入大量对象。
视图可以用来进行各种查询。
[编辑]
我对CouchDB的内存使用情况很好奇,于是做了一个简单的实验。
我在一个空数据库中分批插入了500,000个文档,每批50,000个。这个过程在我的Code Duo MacBook上大约花了15到20分钟。在插入过程中,CouchDB进程的最大内存使用量是120MB(插入50,000个文档时),而插入25,000个文档时大约是60MB。
最终数据库的大小大约是1.2GB。CouchDB空闲时的内存使用量是40MB。获取单个文档的速度非常快(使用Futon网页前端)。
我插入的文档格式如下(用Python生成的JSON):
'{"_id" : "%09d", "name" : "example", "field%d" : "hello"}' %
(num, random.randint(0, 100))
或者
{"_id" : "005049980", "name" : "example", "field77" : "hello"}
其中_id
用作键,文档是根据这个键进行排序的。
关于你提供的示例查询,它们的效率不高,因为通常需要遍历整个文档集才能得到结果。不过,在创建特定视图后,这些查询都可以优化。