【问题标题】:NOSQL databases for sets (as opposed to dicts/key-value stores)?用于集合的 NOSQL 数据库(与字典/键值存储相对)?
【发布时间】:2012-11-08 05:15:08
【问题描述】:

我正在尝试找到一个数据库来充当 Python 集。这是因为我的数据太大而无法存储在内存中。

我尝试使用 SQLite,但听说它可能会出现超过 10 GB 数据的性能问题,所以我正在考虑尝试CouchDB

问题是它似乎像字典一样工作,而不是像集合?

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

(我必须用 Python 编写代码,所以我对易于使用 Python 的东西感兴趣)

编辑:

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

【问题讨论】:

  • 如果你的目标是存储超过 10GB 的单个集合,你可能不应该使用 python。另外,如果您有多个集合,并且每个集合都比较小,您是否考虑过平面文件数据库?
  • 我会将它存储为一个很棒的集合。也希望能尽快完成,因为这对性能至关重要。
  • 这使事情变得复杂。您期待什么样的访问模式?
  • 交替插入一个/查找一个。如果值已经存在,我可能不会再插入。

标签: python couchdb large-data nosql


【解决方案1】:

根据How is set() implemented? 的主要答案,键/值存储的行为类似于dict,但这几乎就是set 的实现方式。为什么不只使用一个小的虚拟值,然后对键进行设置操作?

【讨论】:

  • 直截了当的解决方案。但是,NoSQL dbs 是否也一定会以相同的方式实现集合和字典?
  • 不一定,我会说,但通常两种数据结构都将使用哈希表。但是,键/值存储可能无法为如此大量的键做好准备。一旦超过最佳容量,大多数(所有?)类型的哈希表的性能都会严重下降
  • 这个缺点可能也适用于这些系统中的集合。我真的想不出为什么数据库会为集合选择更优化/可扩展的设计,但不会为地图选择。但当然你是对的,无论 OP 采用什么解决方案,他们都需要确保它的设计可以缩放到他们想要的集合大小,并且使用地图来实现集合留有优化的空间。
  • @goncalopp 存储 70 000 000 个唯一值是否有这种风险?
  • @acjohnson55 你是对的,当然,它们本质上是相同的(尽管我希望典型的数据库在其值上具有比其键更高的默认最佳容量)
【解决方案2】:

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

它有一个 python 客户端。

【讨论】:

  • redis.io/topics/faq :“我喜欢 Redis 高级操作和功能,但我不喜欢它把所有东西都放在内存中,而且我不能有一个更大的数据集内存。计划改变这个?”
【解决方案3】:

您为什么不使用设置值作为唯一键创建一个集合?

更新: 例如,您有这样的文档:

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

你可以像这样创建一个新的集合:

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

由于您不需要同时使用全部数据,因此无需将其嵌入到主文档中。

【讨论】:

    猜你喜欢
    • 2012-01-16
    • 1970-01-01
    • 2018-06-08
    • 1970-01-01
    • 2012-08-23
    • 1970-01-01
    • 2011-01-15
    • 2021-04-05
    • 1970-01-01
    相关资源
    最近更新 更多