LINUX.ORG.RU

grep по очень большому количеству идентификаторов

 , знает,


0

1

Маячит на горизонте задача фильтровать логи по миллионам идентификаторов.
Логи не в базе, а в файлах, обычные такие текстовый логи
Ради интереса сгененировал файл с числами от нуля до нескольких миллионов и попробовал скормить его grep'у

echo teststring | grep -f list.txt
grep ожидаемо помер (grep: память исчерпана)
Понятно, что делаться в итоге всё будет не на грепе, но у меня пока чисто спортивный интерес - можно ли решить задачу без использования компилятора

★★★★★

cat grep.txt | while read Expr; do grep "$Expr" mylog.log >> greped.log; done

Так не пойдёт?

firestarter ★★★☆
()

А если срезать из файла седом строки, скажем с интервалом в 1000 и их грепать.

LINE_COUNT=`wc -l list.txt | cut -f1 -d" "`
for i in `seq 0 $((($LINE_COUNT / 1000)-1))`
do 
sed -n $(($i*1000 +1)),$((($i+1)*1000))p -i list.txt | grep teststring 
done

kostik87 ★★★★★
()

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

Можно, интерпретатором. Делал такой поиcк на js, за основу берется http://ru.wikipedia.org/wiki/Алгоритм_Ахо-Корасик

Deleted
()

Я скрипт делал для «распарсивания» логов сквида. Делаю mmap, а потом фигачу поиск обычным strstr (регулярки не делал, т.к. в моей задаче они не нужны были). Получалось очень шустро.

вот сам скрипт

Eddy_Em ☆☆☆☆☆
()
Последнее исправление: Eddy_Em (всего исправлений: 1)
Ответ на: комментарий от Deleted

Только твоего мнения и ждали, иди учи уже уроки.

То, что написано писалось без Linux и не тестировалось, просто предложение по обходу проблемы.

kostik87 ★★★★★
()

grep: память исчерпана

Так память действительно кончилась? Может внутри grep или системных либ или ядра ограничения стоят?

А вообще, если логи большие и идентификаторов много, то grep ИМХО тут не поможет. Придётся двигаться последовательно либо по логу, либо по списку id. Иначе (даже если grep прокатит) работать это должно доооооолго.

anonymous
()

Наверное, perl, очевидно он для этого и предназначен. Как там в аннотации, «язык для разбора чепухи?»

cadaber ★★
()

firestarter, kostik87, subwoofer, Eddy_Em, cadaber, - всем спасибо за предложения.
Наверно, надо было уточнить, что логов тоже немало (десятки гигабайт в час), поэтому варианты с многими форками и временными файлами скорее всего не подойдут. Но вот памяти скорее всего будет достаточно, первичный тест я делал на ноуте, а на деле этим будет заниматься сервер с 48G оперативки (но даже для него решение в лоб с грепом вряд ли подойдёт)
Отдельное спасибо за скрипты на сях и плюсах :)
Насчёт перла ничего сказать не могу, ибо не знаток

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

Да не за что.

Я, кстати, извиняюсь: не тот «скриптик» кинул (забыл я, где mmap использовал). Еще можешь глянуть mydiff: я там полностью копирую файлы в оперативу и там уже strstr.

А еще есть забавный скрипт для перемены файлов местами: swapfiles (писал по какой-то ЛОРовской теме о том, как менять местами файлы на двух переполненных разделах).

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