У меня есть файл на 1.2 ГБ, который содержит одну строку строки. То, в чем я нуждаюсь, должно искать весь файл для нахождения положения другой строки (в настоящее время, у меня есть список строк для поиска). Способ, чем я делаю его теперь, открывает большой файл, и переместите указатель через блоки 4 КБ, затем переместив указатель X положений назад в файле и получите на 4 КБ больше.
Моя проблема состоит в том, что большая строка для поиска, большее время, к которому он берет, получила его.
Можно ли дать мне некоторое представление для оптимизации сценария для получения лучшего времени поиска?
это - моя реализация:
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);
}
}
Заранее спасибо!
Почему бы не использовать exec
+ grep -b
?
exec('grep "new" ext-all-debug.js -b', $result);
// here we have looked for "new" substring entries in the extjs debug src file
var_dump($result);
пример результата:
array(1142) {
[0]=> string(97) "3398: * insert new elements. Revisiting the example above, we could utilize templating this time:"
[1]=> string(54) "3910:var tpl = new Ext.DomHelper.createTemplate(html);"
...
}
Каждый элемент состоит из смещения строки в байтах от начала файла и самой строки, разделенных двоеточием.
После этого нужно найти конкретную строку и добавить позицию к смещению строки. Например:
[0]=> string(97) "3398: * insert new elements. Revisiting the example above, we could utilize templating this time:"
это означает, что вхождение "new" найдено в 3408-м байте (3398 - позиция строки, 10 - позиция "new" внутри этой строки)
$big_one = fopen('big_one.txt','r');
$options = fopen('options.txt','r');
while(!feof($options))
{
$option = trim(fgets($options));
$position = substr($big_one,$option);
if($position)
return $position; //exit loop
}
размер файла довольно большой. возможно, вам стоит подумать о хранении данных в базе данных. или, если вы не можете, используйте решение grep, опубликованное здесь.