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

Тема в разделе "PHP", создана пользователем casher, 6 апр 2010.

Статус темы:
Закрыта.
Модераторы: latteo
  1. casher

    casher

    Регистр.:
    24 фев 2008
    Сообщения:
    168
    Симпатии:
    17
    подскажите, пожалуйста, как быстрее и с меньшей нагрузкой на проц найти строку в большом файле?
    На данный момент, весь файл загоняется в массив построчно, а затем подстрока ищется с помощью strpos перебором по всему массиву.
     
  2. NightIxIFire

    NightIxIFire Писатель

    Регистр.:
    3 дек 2009
    Сообщения:
    2
    Симпатии:
    0
    По-моему, без перебора не обойтись
     
  3. bondaf

    bondaf Постоялец

    Регистр.:
    16 мар 2010
    Сообщения:
    85
    Симпатии:
    20
    Загонять весь файл в массив - это жестоко.
    Как минимум, читать файл построчно.
    А лучше так:
    PHP:
    echo exec("grep 'privet' zzz.txt");
    Выведет строки, в которых содержится слово privet
     
    bolyk и casher нравится это.
  4. lesorub

    lesorub Жаббервог

    Регистр.:
    22 дек 2008
    Сообщения:
    328
    Симпатии:
    281
    читай из файла построчно и проверяй условие
    PHP:
    $fh=fopen('file.txt','r');
    while(!
    feof($fh)){
        
    $buffer=fgets($fh,4096);
        ...
    }
     
    casher нравится это.
  5. casher

    casher

    Регистр.:
    24 фев 2008
    Сообщения:
    168
    Симпатии:
    17
    to bondaf
    пробовал на денвере. т.е. через виндовую команду find. работает медленнее более чем в 2 раза. може на линуксе быстрее..

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

    Liver

    Регистр.:
    24 сен 2008
    Сообщения:
    316
    Симпатии:
    91
    cacher

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

    Кстати еще неизвестно как там функция file() устроена. может она тоже проходит через свой fgets
     
  7. lesorub

    lesorub Жаббервог

    Регистр.:
    22 дек 2008
    Сообщения:
    328
    Симпатии:
    281
    метод экономит оперативку, но из-за многократного доступа к диску работает медленнее.
     
  8. venetu

    venetu

    Регистр.:
    28 мар 2007
    Сообщения:
    735
    Симпатии:
    261
    Обычно человечество решает такую проблему построением индексов.

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

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

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