как бысрее и с меньшей нагрузкой на проц найти сроку в большом файле

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

casher

Полезный
Регистрация
24 Фев 2008
Сообщения
168
Реакции
17
подскажите, пожалуйста, как быстрее и с меньшей нагрузкой на проц найти строку в большом файле?
На данный момент, весь файл загоняется в массив построчно, а затем подстрока ищется с помощью strpos перебором по всему массиву.
 
По-моему, без перебора не обойтись
 
Загонять весь файл в массив - это жестоко.
Как минимум, читать файл построчно.
А лучше так:
PHP:
echo exec("grep 'privet' zzz.txt");

Выведет строки, в которых содержится слово privet
 
читай из файла построчно и проверяй условие
PHP:
$fh=fopen('file.txt','r');
while(!feof($fh)){
    $buffer=fgets($fh,4096);
    ...
}
 
to bondaf
пробовал на денвере. т.е. через виндовую команду find. работает медленнее более чем в 2 раза. може на линуксе быстрее..

to lesorub
будет ли этот метод работь быстрее если нужно проверить 1к строк? этож для каждой подстроки нужно будет заново обращаться к файлу.
 
cacher

1к строк это мелочи. я вот разбирал базу пастухова в 70 лямов строк. скорость 100тыс строк в секунду.

Кстати еще неизвестно как там функция file() устроена. может она тоже проходит через свой fgets
 
будет ли этот метод работь быстрее если нужно проверить 1к строк? этож для каждой подстроки нужно будет заново обращаться к файлу.
метод экономит оперативку, но из-за многократного доступа к диску работает медленнее.
 
Обычно человечество решает такую проблему построением индексов.

В некоторых случаях возможно обойтись простой сортировкой - по отсортированному файлу можно легко искать методом половинного деления и лопатить при этом не весь файл, а только его малую часть.

Если же файл не отсортирован, и индексов никаких нет, то иначе чем полным перебором эта проблема не решается в принципе. И пох, будет это делать виндовый find или юниховый grep или ты сам на php. Алгоритмически это время одного порядка.

И да, весь файл загружать в память не нужно, т.е. лучше в цикле fgets() чем один раз file(). Оно само прочитает сколько надо в кеш и будет тебе построчно выдавать, каждый раз дисковую систему дергать не будет. Много памяти - большой кеш, мало - маленький, но это все на уровне операционной системы решается, а значит везде работает. По-любому не вылетит от нехватки памяти на большом файле и при этом оптимально сократит обращения к диску.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху