检查大量字符串中存在的有效方法

时间:2012-11-15 20:19:58

标签: python berkeley-db leveldb kyotocabinet

我有一组1亿多个字符串,每个长达63个字符。我有很多磁盘空间和很少的内存(512 MB)。我需要单独查询存在,并且不存储其他元数据。

我的事实上的解决方案是BDB btree。有没有更好的选择?我知道leveldb和Kyoto Cabinet,但不熟悉以确定优势。

2 个答案:

答案 0 :(得分:5)

如果误报是可以接受的,那么一种可能的解决方案是使用bloom filter。 Bloom过滤器类似于散列表,但它不使用一个散列值来索引桶表,而是使用多个散列来索引位数组。设置对应于那些索引的位。然后,为了测试字符串是否在过滤器中,字符串再次进行哈希处理,如果设置了相应的索引,则该字符串在过滤器中“。”

它不存储有关字符串的任何信息,因此它使用的内存非常少 - 但如果两个字符串之间发生冲突,则无法进行冲突解决。这意味着可能存在误报(因为不在过滤器中的字符串可能会散布到与过滤器中的字符串相同的索引)。但是,没有假阴性;任何真正在集合中的字符串都将在bloom过滤器中找到。

有一个few Python implementations。滚动自己也不难;我记得曾经使用表现相当不错的bitarray编码一个快速而肮脏的布隆过滤器。

答案 1 :(得分:1)

你说你有很多磁盘,对吧?一种选择是将字符串存储为嵌套子目录中的文件名。您可以直接使用字符串:

  • d/r/e/w/ sears
  • 中存储“画了西尔斯”

或者通过获取字符串的哈希并遵循类似的过程:

  • MD5('drew sears')='f010fe6e20d12ed895c10b93b2f81c6e'
  • 创建名为f0/10/fe/6e/20d12ed895c10b93b2f81c6e
  • 的空文件

将其视为基于操作系统优化的基于哈希表的索引NoSQL数据库。

附带好处:

  • 您可以稍后改变主意,并将数据存储在文件中。
  • 您可以使用rsync将数据库复制到另一个系统。
相关问题