【问题标题】:Performance for searching through 100 million records搜索 1 亿条记录的性能
【发布时间】:2011-12-13 07:42:59
【问题描述】:

我正在做 PHP 并且有 1100 万个域的文本文件加载到一个数组中,然后我使用正则表达式搜索它们。

为此,我需要将内存限制提高到 2gigs,然后处理大约需要 10 秒。我很快就会拥有 1 亿个域,并计划迁移到数据库解决方案,但是,在搜索 1 亿个域的列表时如何获得良好的性能?

我像这样使用正则表达式进行搜索:

$domains = preg_grep("/store\./", $array);

foreach($domains as $domain) {echo $domain;}

【问题讨论】:

  • 现在有 1100 万个域,未来有 1 亿个?这需要数据库!!!

标签: mysql regex performance search dns


【解决方案1】:

像 lucene 这样的搜索引擎怎么样: http://lucene.apache.org/java/docs/index.html

就是为了这个目的。

【讨论】:

  • 是的,感谢您将我指向 Lucene。你对 Sphinx、ElasticSearch 和 Lucene 有什么看法吗?
  • 对不起,我只知道 lucene,所以无法评论
【解决方案2】:

取决于您所说的“搜索”。正则表达式?扫描部分字符串?数据库需要帮助 - 索引对于完全部分匹配没有帮助。

OTOH 进行真正的匹配(特别是如果您像域名一样存储与顶级部分分开)...我希望在任何体面的硬件上都有个位数的毫秒。

Regex - 最好将文件一次加载到内存中并保存在那里。是的,需要 2 场演出——谁在乎呢。 64 GB 的服务器很便宜 ;)

【讨论】:

    【解决方案3】:

    正则表达式可能是最慢的搜索方式。如果您要处理如此大量的数据,您可能会从 MongoDB 中受益。

    【讨论】:

      【解决方案4】:

      如果您知道域的开头,这可能会很有趣。您可以将文本文件分成“开头”文件。一个域可以以 36 个不同的字符开头(即 a-z 加 0-9)。拥有 36 个不同的文件,并以这种方式维护它们。

      由于您的示例以“s”开头,您将在“s”文件上运行它,并发现查询要快得多 - 搜索的内容更少。

      如果您始终知道搜索的前 N ​​个字符(即前面没有通配符),您可以通过将文件分组来获得成倍更好的结果。由于后续字符可能包含连字符,因此您的文件数将不超过 36 * (37 ^ (N - 1)),其中 N > 1... 这仍然很多!

      【讨论】:

      • 我想做不同类型的搜索,所有有 4 个字符的域,以单词结尾的域等。
      • Np。那么我会选择@khebbie 的解决方案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-26
      • 1970-01-01
      • 1970-01-01
      • 2017-08-12
      • 2019-02-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多