【发布时间】:2015-03-23 01:56:23
【问题描述】:
我有 20MB 的平面文件数据库,大约 500k 行,只允许[a-z0-9-] 字符,平均一行 7 个单词,没有空行或重复行:
平面文件数据库:
put-returns-between-paragraphs
for-linebreak-add-2-spaces-at-end
indent-code-by-4-spaces-indent-code-by-4-spaces
我正在搜索 whole words only 并从该数据库中提取 first 10k results。
到目前为止,如果在 db 的前 20k 行中找到 10k 个匹配项,则此代码可以正常工作,但如果该词很少见,则脚本必须搜索所有 500k 行,这会慢 10 倍。
设置:
$cats = file("cats.txt", FILE_IGNORE_NEW_LINES);
$search = "end";
$limit = 10000;
搜索:
foreach($cats as $cat) {
if(preg_match("/\b$search\b/", $cat)) {
$cats_found[] = $cat;
if(isset($cats_found[$limit])) break;
}
}
我的php技能和知识有限,我不会也不知道如何使用sql,所以这是我能做到的最好的,但我需要一些建议:
- 这是正确的代码吗,foreach 和 preg_match 有问题?
- 我应该将大文件拆分成较小的文件吗?如果是的话,大小是多少?
- 最后,sql会快多少? (未来的选择)
感谢您阅读本文,抱歉英语不好,这是我的第三种语言。
【问题讨论】: