【发布时间】:2011-03-01 22:06:53
【问题描述】:
我有一个 1.2GB 的文件,其中包含一个单行字符串。 我需要的是搜索整个文件以找到另一个字符串的位置(目前我有一个要搜索的字符串列表)。 我现在做的方式是打开大文件并将指针移过 4Kb 块,然后将指针 X 位置移回文件中并获得 4Kb 更多。
我的问题是要搜索的字符串越大,他得到它的时间就越长。
您能给我一些想法来优化脚本以获得更好的搜索时间吗?
这是我的实现:
function busca($inici){
$limit = 4096;
$big_one = fopen('big_one.txt','r');
$options = fopen('options.txt','r');
while(!feof($options)){
$search = trim(fgets($options));
$retro = strlen($search);//maybe setting this position absolute? (like 12 or 15)
$punter = 0;
while(!feof($big_one)){
$ara = fgets($big_one,$limit);
$pos = strpos($ara,$search);
$ok_pos = $pos + $punter;
if($pos !== false){
echo "$pos - $punter - $search : $ok_pos <br>";
break;
}
$punter += $limit - $retro;
fseek($big_one,$punter);
}
fseek($big_one,0);
}
}
提前致谢!
【问题讨论】:
-
对 1.2GB 文件使用普通的 strpos() 函数会发生什么?
-
我在 PHP 中找到了一个针对不同匹配方法的基准,但 strpos() 是最快的。 hashbangcode.com/blog/fastest-way-match-string-php-200.html
-
options.txt 有多大,它长什么样子?
-
powtac,我不是一次打开 1.2GB 的,我是分段打开的,它只浪费 32MB 的 RAM(大约)。 0scar,options.txt 有 25000000 万行(选项为 50M)。
-
powtac,我已经阅读了一些关于 strpos 的类似基准,因此我正在寻找脚本所有部分的优化。
标签: php string search performance