现在我正在做PHP并且在文本文件中有1100万个域加载到一个数组中,然后我使用Regex搜索它们。要做到这一点,我需要将内存限制增加到2gig然后处理需要10秒钟。我将很快拥有1亿个域名并计划迁移到数据库解决方案,但是,在搜索1亿个域名列表时,如何获得良好的性能?
我使用正则表达式搜索:
$ domains = preg_grep(“/ store./”,$ array);
foreach($ domains as $ domain){echo $ domain;}
答案 0 :(得分:3)
像lucene这样的搜索引擎怎么样: http://lucene.apache.org/java/docs/index.html
这是出于这个目的。
答案 1 :(得分:1)
正则表达式可能是搜索某些内容的最慢方式。如果您正在处理如此大量的数据,您可能会从MongoDB中受益。
答案 2 :(得分:0)
取决于“搜索”的含义。正则表达式?扫描部分字符串?数据库很有帮助 - 索引对完全部分匹配没有帮助。
用于实际匹配的OTOH(特别是如果您将域名与顶级部分分开存储)...我希望在任何体面的硬件上都有单位数ms。
正则表达式 - 更好地将文件加载到内存中并保存在那里。是的,需要2演出 - 谁在乎。 64千兆字节的服务器很便宜;)
答案 3 :(得分:0)
如果你知道域名的起源,这可能会引起人们的兴趣。您可以将文本文件分成“开头”文件。域可以以36个不同的字符开头(即a-z加0-9)。有36个不同的文件,并保持这种方式。
由于你的例子以's'开头,你可以在's'文件上运行它,并发现查询更快 - 它搜索的内容更少。
如果你总是知道搜索的前N个字符(即前面没有通配符),你可以通过将文件分成组来获得指数级更好的结果。由于后续字符可能包括hifen,因此您的文件数量不会超过36 *(37 ^(N-1)),其中N> 1。 1 ...还是很多!