Большой Воронежский Форум
» Программирование>Поиск строки в файле
Kerish 10:51 15.12.2005
Есть задача проверять наличие данной строки в файле.
Нюанс в том, что надо проверить присутствуют ли в файле 20-30 тысяч данных строк.
Всё это работает, но занимает довольно долгое время, так как необходимо проверить большое кол-во файлов. Файл 300 Кб проверяется 10-15 секунд.

Есть ли идеи, как ускорить это?
Язык программирования не важен. [Ответ]
VBA b0.3 13:07 15.12.2005
это думать надо..

.. забей.. лучше реши задачу про точки в окружности [Ответ]
netwind 14:16 15.12.2005
стырить, наконец, из clamav сигнатурный поиск,а через год попасть на страницы газет "беспринципные воронежские программисты за решеткой" ).

а еще лучше начать выпускать на основе clamav какой-нибудь полукоммерческий продукт. [Ответ]
netwind 14:38 15.12.2005
ниразу не приходилось реализовывать, но алгоритм представляется мне так:

двигаясь по файлу вперед, вычисляем контрольные суммы фрагментов C1,C2, ..CN, где N-максимальная длина фрагмента (сигнатуры).
при загрузке из контрольных сумм сигнатур, строится хеш.
дальше каждое C[i] нужно проверить на нахождение в хеше,
если нашлась в хеше, найти сигнатуру и сверить на фактическое побайтное совпадение.

Наверное у кнута есть что-нибудь по теме. [Ответ]
Terry 14:41 15.12.2005
netwind прикольно придумал [Ответ]
zss_vrn 14:48 15.12.2005
Ну, гениальных мыслей у меня нет - их думать надо - а есть простые принцыпы, как я бы действовал для начала.

1. Файлы, по-возможности, грузить в память, потому что считывание целого файла в память довольно быстрая операция по сравнению с поиском по файлу (на кешь не всегда можно полагаться).
2. Искать не текст (строку), а бинарный код, потому что бинарное сравнение работает быстрее (если, конечно, это возможно).
3. Если возможно, для модуля (процедуры, функции и т.д.) сравнения применять оптимизацию компилятора по скорости. Или, если задача сравнения будет решаться побайтовым сравнением, использовать машинную команду сравнения блоков данных - она самая быстрая.
4. Если возможно, придумать хеш-функцию, которая бы отвергала на 100% неодинаковые значения, оставляя только "похоже, что одно и то же". А уж ее результат сравнивать побайтно. [Ответ]
Ray79 14:58 15.12.2005
Открываешь командер,
ф3,
контрол+ф,
пишеш слово,
жмеш поиск.
Алгоритм в 5 строк [Ответ]
Kerish 10:34 16.12.2005
zss_vrn Мой алгоритм практически полностью совпадает с тобою сказанным. Скорость низкая. [Ответ]
netwind 09:52 17.12.2005
кто реализует подобную библиотечку для скоростного поиска сразу по тысячам регулярных выражений - навек войдет в историю антиспама.
вот это уже был бы прорыв. [Ответ]
zss_vrn 09:12 19.12.2005
Kerish
[Ответ]
Akad 10:14 19.12.2005
Kerish Если поиск бинарный, то можно с кэшем попробывать поиграться. Т.е. искать за раз по 10-20 строк в небольших отрезках файла. И если проц двуядерный, то про распараллеливание тоже не забыть.
Если поиск по тексту - переводим вверхний регистр и делаем бинарный поиск.
Про интеловский компилятор тоже не надо забывать. Вообще 300 кб пройти 30000 раз за 15 секунд - это как-то странно... Ты не на яве писал?
[Ответ]
netwind 10:32 19.12.2005
не, вы вообще читали мой алгоритм в посте №4 ?

Кажется, я понял отчего у меня так тормозит цивилизация4... [Ответ]
Akad 11:02 19.12.2005
netwind Если я правильно понял твой алгоритм, то существенного ускорения он не даст. Может оказаться даже медленнее. Файл у нас не 10Мб... [Ответ]
netwind 11:17 19.12.2005
Калинин Дмитрий наверное, неправильно понял,
там всего за 1 просмотр файла проверяются сразу все сигнатуры.

ну и контрольные суммы можно тоже вычислять циклически не суммируя все подряд,
а на основе предыдущих значений.
Приличных библиотек с реализациями хешей тоже должно быть много.

Профессиональные антивирусы ведь работают очень быстро, значит быстрый алгоримт поиска сигнатур есть. И, скорее всего, похож на описанный. [Ответ]
Вверх