2012-11-20 100 views
2

我试图找到一个数据库来作为一个Python集。这是因为我的数据太大而无法存储在内存中。集合的NOSQL数据库(与字典/键值存储相对)?

我使用SQLite试过,但听说它可能有性能问题>数据中10 GB,所以我期待在试图CouchDB

问题是,它似乎是一个字典的工作,不喜欢组?

是否有一个数据库工具作为Python集?也就是说,它只是存储值而不是键值对呢?

(我要的代码在Python所以我感兴趣的东西,很容易与Python的使用)

编辑:

我将它存储为一个巨大的集合,而不是几个小。

+0

如果您的目标是存储超过10GB的单套,那么您可能不应该使用python。另外,如果你有多个集合,每个集合都比较小,你是否考虑过一个平面文件数据库? – goncalopp

+0

我会把它作为一个伟大的集合存储。同样希望有快速的事情,因为这会对性能至关重要。 –

+0

这使事情变得复杂。你期待什么样的访问模式? – goncalopp

回答

1

根据How is set() implemented?的主要答案,密钥/值存储的行为类似于dict,但无论如何,set的实现方式基本如此。为什么不只是使用一个小的虚拟值,并对键进行设置操作?

+0

直截了当的解决方案。但NoSQL dbs是否也会以相同的方式实现集合和字典? –

+1

不一定,我会说,但通常两个数据结构都将使用散列表。但是,一个键/值存储可能没有为这么多的键准备好。大多数(所有?)类型的散列表在性能严重下降时,一旦超过其最佳容量 – goncalopp

+0

这种缺点也可能适用于这些系统中的套件。我无法真正想到数据库会为集合选择更优化/可扩展设计的原因,但不能为地图选择。但是,当然你是对的,无论OP采用什么解决方案,他们都需要确保它的设计能够缩放到他们想要的设置大小,并且使用地图来实现一组留给优化的余地。 – acjay

1

Redis的可存储的数据类型:
http://redis.io/topics/data-types

它有一个Python客户端。

+0

http://redis.io/topics/faq:“我喜欢Redis的高级操作和功能,但我不喜欢它将内存中的所有内容都存储在内存中,并且我无法使数据集扩大内存。这个?” –

+0

保持upvote,因为你在我的标题中回答了q。 –

0

为什么不使用设置值作为唯一键的集合?

UPD: 例如,你有文件是这样的:

{ 
    _id: "someid", 
    youset: {val1, val2, val3}, 
} 

您可以创建一个新的集合,如:

{ 
    _id: val1, 
    owner: "someid" 
} 
{ 
    _id: val2, 
    owner: "someid" 
} 
{ 
    _id: val3, 
    owner: "someid" 
} 
... 

既然你不同时需要整个数据,不需要将其嵌入到主文档中。

+0

请解释。 –