我有一个问题,我正在寻找一些指导来解决最有效的方法。我有 2 亿个数据字符串,大小从 3 个字符到 70 个字符不等。字符串由字母数字和几个特殊字符(如破折号和下划线)组成。我需要能够快速搜索整个字符串或字符串中的任何子字符串(最小子字符串大小为 3)。快速在这里定义为小于 1 秒。
作为我的第一次剪辑,我做了以下事情:
创建了 38 个索引文件。索引包含以特定字母开头的所有子字符串。前 4mb 包含 100 万个哈希桶(哈希链的开始)。索引的其余部分包含来自哈希桶的链表链。我的散列分布非常均匀。100 万个哈希桶保存在 RAM 中并镜像到磁盘。
当一个字符串被添加到索引中时,它被分解成它的非重复(在其自身内)3-n 个字符的子字符串(当 n 是字符串 1 的长度时)。因此,例如,“apples”作为 pples,pple,ppl,pp 存储在“A”索引中(子字符串也存储在“L”和“P”索引中)。
搜索/添加服务器作为守护程序运行(在 C++ 中)并且像冠军一样工作。典型的搜索时间小于 1/2 秒。
问题出在流程的前端。我通常一次添加 30,000 个密钥。这部分过程需要很长时间。作为基准,加载到 180,000 个可变长度键的空索引的时间约为 3 1/2 小时。
除了很长的加载时间外,该方案有效。
在我疯狂优化(或尝试)之前,我想知道是否有更好的方法来解决这个问题。对于这么大的数据集,前后通配符搜索(即:DBMS 中的“%ppl%”之类的字符串非常慢(例如,在 MySQL 中大约为几个小时)。所以看起来 DBMS 解决方案是不可能的。我不能使用全文搜索,因为我们处理的不是普通单词,而是可能由也可能不是由真实单词组成的字符串。