【发布时间】:2017-07-06 20:58:02
【问题描述】:
我在优化我在 PHP 中创建的搜索时遇到问题,该搜索是一次性使用的,因此灵活性并不那么重要。
我有一系列句子,例如:
$arr = [
'potato',
'hi my name is Ivan'
..
];
该数组包含大约 1k 个句子。
我有一个包含 200 GB 文件的硬盘。
我需要搜索所有文件,看看这些句子是否在文件中,如果是,则以特定格式打印出路径、校验和等。
我面临的问题是搜索时间,当做这样的事情时,这似乎效率低下:
$objections = [];
foreach ($files as $file) {
if (!in_array($file->getExtension(), $allowedExt))
continue;
$txt = file_get_contents($file);
foreach ($words as $word) {
if (stripos($txt, $word) !== false ||
stripos($file->getFilename(), $word) !== false
) {
$file->c_md5 = getCMD5($file);
$objections[] = $file;
}
}
}
搜索本身需要 1 小时以上的时间,而我正在使用最新 i7 的新 MacBook。使用 PHP 内存等最大化。
在单词数组中匹配哪个单词无关紧要,所以我想知道是否有更聪明的方法来执行搜索,而不是在文件循环中循环单词。带有 OR 的很长的 REGEX 字符串会更快吗?
或者有没有第三种方法非常快。
【问题讨论】:
-
我不知道一个大的正则表达式是否会更快,但如果你知道如何做一个(你似乎知道),只需尝试它并进行基准测试。有了这么多的数据,无论如何它可能会非常慢。