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

2 投票
5 回答
1018 浏览
提问于 2025-04-16 10:11

问题

每个字典都有一个独特的数字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 个回答

1

Pytables可能是一个适合你的选择,详细信息可以查看这个链接:http://www.pytables.org/moin

1

试试使用littletable吧。它可以处理一堆对象,自动从对象的属性中推断出列名,还支持简单的查询、连接和数据透视表操作。一个很不错的地方是,查询和连接操作的结果都是新的、完整的、可以查询的littletable。

littletable还没有引起太多关注或使用,所以我很想听听你对它的反馈或使用体验。

2

你可以试试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用作键,文档是根据这个键进行排序的。

关于你提供的示例查询,它们的效率不高,因为通常需要遍历整个文档集才能得到结果。不过,在创建特定视图后,这些查询都可以优化。

撰写回答