存储大量独特字符串的最快方法是什么?

时间:2012-04-13 09:47:15

标签: algorithm storage

我想知道存储大量字符串和检查重复的最佳方法是什么。

我们必须考虑我们的优先事项:

  • 重复检查速度
  • 插入新的字符串时间
  • 硬盘上的存储空间
  • 随机访问时间

什么是最佳解决方案,当我们的目标是快速重复检查并插入新字符串时间(没有随机访问或存储空间问题)? 我考虑过SQL数据库,但哪个DB最适合这个解决方案?     如果我们使用SQL DB,比如MySQL,哪个存储引擎最好? (当然,由于数据量的原因,我们必须排除内存)

3 个答案:

答案 0 :(得分:4)

在输入字符串上使用哈希函数。输出散列将是记录的主键/ id。

然后你可以检查数据库是否有这个hash / id / primary key:

  • 如果没有:这是一个新字符串;你添加一个新的记录,包括字符串和哈希为id。
  • 如果是:检查加载记录中的字符串是否与输入字符串相同。
    • 如果字符串相同:它是重复的
    • 如果字符串不同:这是一次碰撞。使用collision resolution方案解决。 (以下几个例子)

您必须根据速度和预期的字符串数量以及哈希冲突要求/保证来考虑使用哪个哈希函数/方案/强度。

解决冲突的几种方法:

  • 使用第二个哈希函数在同一个表中提供一个新哈希。
  • 标记记录(例如,使用NULL)并在辅助“冲突”表上使用更强的第二哈希函数(具有更宽的域)重复。在查询时,如果字符串被标记为冲突(例如,NULL),则在冲突表中再次执行查找。您可能还希望使用dynamic perfect hashing来确保此第二个表没有进一步的冲突。

当然,取决于这需要多长时间以及你期望占用多少内存/字符串数量,你实际上可以在没有数据库的情况下直接在内存中执行此操作,这会更快。

答案 1 :(得分:3)

您可能需要考虑NoSQL解决方案:

<强> Redis 即可。使用Redis解决了一些用例:

<强> memcached 即可。 memcached和Redis之间的一些比较:

Membase/Couchbase 将OMGPOP的Draw Something视为one of their success stories。 Redis和Membase的比较:

有些问题:

  • 字符串集有多大?
  • 应用程序是重读还是重写?或两者兼而有之?
  • 您希望将数据持久保存到磁盘的频率是多少?
  • 是否有 N个最新字符串要求?

希望这有帮助。

答案 2 :(得分:1)

生成后缀树以存储字符串。 Ukkonen在http://www.daimi.au.dk/~mailund/slides/Ukkonen-2005.pdf中的算法将为如何创建后缀树提供一些见解。有多种方法可以存储此后缀树。但是一旦生成,查找时间就非常短。