Максимально быстрый способ перейти к нужной строке в gz файле

Статус
В этой теме нельзя размещать новые ответы.

SoaringHawk

Постоялец
Регистрация
25 Апр 2009
Сообщения
61
Реакции
2
Есть файл text.txt.gz. В нем много строк текста. Необходима быстрая выборка нужной строки, зная ее номер.
Вариант "в лоб" просто перебирать каждую строку, пока не дойдешь до нужной:
PHP:
$gzf = gzopen($имя_файла, 'r');
for($i = 0; $i <= $номер_нужной_строки; $i++)
{
     $ktxt = gzgets($gzf, 4096);
}
gzclose($gzf);
Но этот способ жутко медленный, когда строк за 1000 и нужно, например 999-ю. :) Дело в том, что не известны позиции новых строк, что бы использовать gzseek.
 
Для просмотра ссылки Войди или Зарегистрируйся
думаю это будет работать быстрее
но и памяти соответсвенно будет больше есть, по аналогии с file()
 
Для просмотра ссылки Войди или Зарегистрируйся
думаю это будет работать быстрее
но и памяти соответсвенно будет больше есть, по аналогии с file()
Да ну. :D
gzfile всегда читает весь файл + еще и массив создает. По моим тестам gzfile ~ в 1.26 раза медленнее, чем мой 1-й способ, при условии прохода по всем строкам. :)
 
провел набор тестов
во первых, gzfile оказался на моих тестах чуточку быстрее
во-чторых, я нашел альтернативный более быстрый способ(только его надо допилить напильником на предмет исключительных ситуаций)
 
провел набор тестов
во первых, gzfile оказался на моих тестах чуточку быстрее
во-чторых, я нашел альтернативный более быстрый способ(только его надо допилить напильником на предмет исключительных ситуаций)
*** скрытое содержание ***
Да, забавно. У тебя в примере gzfile быстрее и 3-й вариант работает практически вдвое быстрее первых двух. :) ... но, стоит увеличить длину строки хотя бы в 10 раз (строка 7, поставить к примеру rand(100,400)) и результаты поменяются в корне. А ведь у меня строки длиной не менее 1000. Хотя даже в этом случае 3-й вариант чуток, но быстрее. :) И как видно gzfile проигрывает вчистую.
 
но, стоит увеличить длину строки хотя бы в 10 раз (строка 7, поставить к примеру rand(100,400)) и результаты поменяются в корне. А ведь у меня строки длиной не менее 1000.
а где об этом изначально у тебя было написано?
тестировал на тех цифрах, что пришли в голову.
раз, третий все равно быстрее, попробуй провести тест с ним, для разных значений буфера
думаю, можно добиться более высокой производительности
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху