поиск строки скорости в PHP

У меня есть файл на 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);
        }
    }

Заранее спасибо!

5
задан Marc 9 June 2010 в 22:09
поделиться

2 ответа

Почему бы не использовать 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" внутри этой строки)

10
ответ дан 13 December 2019 в 19:22
поделиться
$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, опубликованное здесь.

1
ответ дан 13 December 2019 в 19:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: