LINUX.ORG.RU

Как определить наличие строки в весьма большом файле ?

 ,


0

2

Вроде бы вопрос тривиальный, берешь grep и вуаля. Но файл очень большой и переводов строк там нет, в итоге grep завершается с исчерпанием памяти.

Как принято изворачиваться в таких случаях ?

Вроде где то слышал про утилиту что разбивает файл на «слова», но в упор не могу вспомнить.

★★★

Очень большой это сколько?

Вроде где то слышал про утилиту что разбивает файл на «слова», но в упор не могу вспомнить.

tr ' ' '\n' < file.txt 

да хотя бы так поменять пробелы на конец строки и потом грепнуть. И лучше fgrep, а не grep.

xtraeft ★★☆☆
()
Последнее исправление: xtraeft (всего исправлений: 1)

perl, python, tcl, etc в руки и вперед.

Придумываешь глупый алгоритм сравнения с учетом того, что читаешь порциями файл. Профит.

habamax ★★★
()
grep -q --max-count=1 STRING FILENAME && echo FOUND
anonymous
()
Ответ на: комментарий от habamax

Вроде где то слышал про утилиту что разбивает файл на «слова», но в упор не могу вспомнить.

Он спросил - я ответил. А если весь файл - одна большая строка, то греп всю эту строку в качестве результата и выдаст (если не использовать флаг -o)!

xtraeft ★★☆☆
()
Ответ на: комментарий от xtraeft

Очень большой это сколько?

1,824,988,911 байт

да хотя бы так поменять пробелы на конец строки и потом грепнуть.

Блин точн. Спасиб.

TEX ★★★
() автор топика
Ответ на: комментарий от bvn13

Перл не знаю, но тут памяти может не хватить тоже? Из стандартного инпута данные регекспятся?

Можно же глупый алгоритм использовать:

1. прочитать мегабайт(например)

2. поискать строчку

3. если не нашел, прочитать следующий мегабайт со смещением назад на длину строчки

4. перейти к п. 2

habamax ★★★
()
Ответ на: комментарий от habamax

Подошло, мне нужно непрерывное значение найти, так что деление по пробелам катит

TEX ★★★
() автор топика
Ответ на: комментарий от TEX

да хотя бы так поменять пробелы на конец строки и потом грепнуть.

Блин точн. Спасиб.

Так тебе одно слово надо найти? Тогда все проще, да.

habamax ★★★
()
Ответ на: комментарий от xtraeft

Тормознее, уже пятую минуту жду

TEX ★★★
() автор топика
Ответ на: комментарий от habamax

grep (GNU grep) не хуже алгоритмы использует (+mmap) и упасть из-за нехватки памяти может только при попытке вывести найденную строку.

anonymous
()
Ответ на: комментарий от xtraeft

Да, тормознее. Я думал, что у него с потреблением памяти получше будет, но на входном файле одной строкой он ест не меньше, чем grep.

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

Да, я тоже проверил уже. Результата даже не дождался.

xtraeft ★★☆☆
()
Ответ на: комментарий от habamax

Можно и такой алгоритм написать. Но однострочник длинный будет.

bvn13 ★★★★★
()

разбить на части дихотомией или золотым сечением или методом монте-карло, в общем планомерно понижать сложность

anonymous
()

grep многократно ускоряется при использовании опции -P (perl regexp'ы). если порезать файл с tr и потом натравить grep -P, будет относительно быстро. впрочем, я как-то перлом регекспами обрабатывала большие файлы и вроде не очень тормозило, было даже быстрее обычного grep'а.

Iron_Bug ★★★★★
()
Ответ на: комментарий от Iron_Bug

grep многократно ускоряется при использовании опции -P (perl regexp'ы)

А если регулярки не нужны, как в этом случае, то еще сильнее он ускоряется с ключом -F (fgrep).

xtraeft ★★☆☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.