Привет всем.
Стоит Ubuntu 10, 4Gb памяти. Есть squid access.log 2.6Gb.
Нужно переместить из этого файла все строки до определенного числа в другой файл.cat access.log | awk '{if($1 < 1304452799) {print}}' > access.log_new
Проблема в том, что оперативная память забивается и я получаю логичный результат "Out of memory!"
Что делать? Помогите пожалуйста.
> Стоит Ubuntu 10, 4Gb памяти. Есть squid access.log 2.6Gb.
> cat access.log | awk '{if($1 < 1304452799) {print}}' > access.log_new
> Проблема в том, что оперативная память забивается и я получаю логичный результат
> "Out of memory!"Ума не приложу, чем бы это он логичный. Построчная обработка - куда памяти-то деваться?
Как варианты телодвижений:
1. выкинуть cat
awk '$1 < 1304452799' <access.log > access.log_new2. попробовать _разные реализации awk - mawk, gawk, ?
3. приделать fflush() (только gawk?)
awk '$1<1304452799{print}NRP000==0{fflush()}' ...
> Ума не приложу, чем бы это он логичный. Построчная обработка - куда
> памяти-то деваться?Андрей, логично, раз память всю загружает.
> 1. выкинуть cat
> awk '$1 < 1304452799' <access.log > access.log_newПопробую.
> 2. попробовать _разные реализации awk - mawk, gawk, ?Все перепробовал, результат тот же.
В файле более 9e6 строк. :-(
head -n 1304452799 < access.log > access.log_newЕсли всё-таки проблема с 32 битами, то сначала порвать файл с помощью split -l, потом собирать из кусочков.
> Как варианты телодвижений: =Ещё , если с awk-ом совсем всё полохо попытаться не читать "в него" весь файл -
awk '$1>=1304452799{exit}{print}' <access.log > access.log_new
или...
head -n +`awk '$1>=1304452799{print NR-1;exit}' <access.log` <access.log > access.log_new
(раз уж вовремя не сделали rotate логов) я бы попробовал "разрезать" его на несколько файлов поменьше, с помощью split(1), а затем уже обрабатывать их.
> Проблема в том, что оперативная память забивается и я получаю логичный результат
> "Out of memory!"
> Что делать? Помогите пожалуйста.память это вряд ли.
ведь еще swap есть? или нет?а скорее всего где то 32-битное число переполняется.
ведь система i386?
или amd64?посмотрите что у awk с поддержкой 64-bit и файлов больше 2G
перекомпилируйте/найдите другой awk
> память это вряд ли.
> ведь еще swap есть? или нет?В том-то и дело, что swap не изменяется. Т.е. free -m показывает, что память вот-вот закончится, а swap`а ещё ого-го.
> а скорее всего где то 32-битное число переполняется.
> ведь система i386?
> или amd64?i386
>файлов больше 2GНе нашел нигде акцентов на узкие места с размером файла.
> перекомпилируйте/найдите другой awkТе же грабли.
Сейчас попробую исключить cat.
> i386
>>файлов больше 2G
> Не нашел нигде акцентов на узкие места с размером файла.
>> перекомпилируйте/найдите другой awk
> Те же грабли.
> Сейчас попробую исключить cat.i386 - значит где то в awk/shell/cat переполняется 32-битное число
вот и: out of memoryпопробуйте запустить тот же скрипт под amd64
или ищите где именно переполняется и опять же ищите
как/можно ли исправить
> попробуйте запустить тот же скрипт под amd64
> или ищите где именно переполняется и опять же ищите
> как/можно ли исправитьСработал. Удивительно. К сожалению нет времени разобраться. Всем спасибо, с наступающим днём Победы!
> Привет всем.
> Стоит Ubuntu 10, 4Gb памяти. Есть squid access.log 2.6Gb.
> Нужно переместить из этого файла все строки до определенного числа в другой
> файл.
> cat access.log | awk '{if($1 < 1304452799) {print}}' > access.log_new
> Проблема в том, что оперативная память забивается и я получаю логичный результат
> "Out of memory!"
> Что делать? Помогите пожалуйста.SIZEOF_FILE=$(du -b /var/log/squid/access.log 2>&1 | awk '{print $1}')
LINES=$(echo "(2^32-1)/80" | bc);for (( i=1; i < $(($SIZEOF_FILE / $LINES )); i++ ))
do
tail -n $(($LINES*$i)) /var/log/squid/access.log;
doneкак-то так
[cut]