URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 9117
[ Назад ]

Исходное сообщение
"Скрипт для обработки большого числа строк."

Отправлено shc0d3r , 06-Май-11 14:30 
Привет всем.
Стоит Ubuntu 10, 4Gb памяти. Есть squid access.log 2.6Gb.
Нужно переместить из этого файла все строки до определенного числа в другой файл.

cat access.log | awk '{if($1 < 1304452799) {print}}' > access.log_new

Проблема в том, что оперативная память забивается и я получаю логичный результат "Out of memory!"

Что делать? Помогите пожалуйста.


Содержание

Сообщения в этом обсуждении
"Скрипт для обработки большого числа строк."
Отправлено Andrey Mitrofanov , 06-Май-11 15:36 
> Стоит 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_new

2. попробовать _разные реализации awk - mawk, gawk, ?

3. приделать fflush() (только gawk?)
awk '$1<1304452799{print}NRP000==0{fflush()}' ...


"Скрипт для обработки большого числа строк."
Отправлено shc0d3r , 06-Май-11 15:51 
> Ума не приложу, чем бы это он логичный. Построчная обработка - куда
> памяти-то деваться?

Андрей, логично, раз память всю загружает.

> 1. выкинуть cat
> awk '$1 < 1304452799' <access.log > access.log_new

Попробую.
> 2. попробовать _разные реализации awk - mawk, gawk, ?

Все перепробовал, результат тот же.

В файле более 9e6 строк. :-(


"Скрипт для обработки большого числа строк."
Отправлено ACCA , 06-Май-11 18:08 
head -n 1304452799 < access.log > access.log_new

Если всё-таки проблема с 32 битами, то сначала порвать файл с помощью split -l, потом собирать из кусочков.


"Скрипт для обработки большого числа строк."
Отправлено Andrey Mitrofanov , 06-Май-11 16:22 
> Как варианты телодвижений: =

Ещё , если с 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


"Скрипт для обработки большого числа строк."
Отправлено phpcoder , 06-Май-11 16:00 
(раз уж вовремя не сделали rotate логов) я бы попробовал "разрезать" его на несколько файлов поменьше, с помощью split(1), а затем уже обрабатывать их.



"Скрипт для обработки большого числа строк."
Отправлено gpl77 , 06-Май-11 17:51 

> Проблема в том, что оперативная память забивается и я получаю логичный результат
> "Out of memory!"
> Что делать? Помогите пожалуйста.

память это вряд ли.
ведь еще swap есть? или нет?

а скорее всего где то 32-битное число переполняется.
ведь система i386?
или amd64?

посмотрите что у awk с поддержкой 64-bit и файлов больше 2G
перекомпилируйте/найдите другой awk


"Скрипт для обработки большого числа строк."
Отправлено shc0d3r , 06-Май-11 20:19 
> память это вряд ли.
> ведь еще swap есть? или нет?

В том-то и дело, что swap не изменяется. Т.е. free -m показывает, что память вот-вот закончится, а swap`а ещё ого-го.

> а скорее всего где то 32-битное число переполняется.
> ведь система i386?
> или amd64?

i386
>файлов больше 2G

Не нашел нигде акцентов на узкие места с размером файла.
> перекомпилируйте/найдите другой awk

Те же грабли.

Сейчас попробую исключить cat.


"Скрипт для обработки большого числа строк."
Отправлено gpl77 , 06-Май-11 23:22 
> i386
>>файлов больше 2G
> Не нашел нигде акцентов на узкие места с размером файла.
>> перекомпилируйте/найдите другой awk
> Те же грабли.
> Сейчас попробую исключить cat.

i386 - значит где то в awk/shell/cat переполняется 32-битное число
вот и: out of memory

попробуйте запустить тот же скрипт под amd64
или ищите где именно переполняется и опять же ищите
как/можно ли исправить


"Скрипт для обработки большого числа строк."
Отправлено shc0d3r , 07-Май-11 18:18 
> попробуйте запустить тот же скрипт под amd64
> или ищите где именно переполняется и опять же ищите
> как/можно ли исправить

Сработал. Удивительно. К сожалению нет времени разобраться. Всем спасибо, с наступающим днём Победы!


"Скрипт для обработки большого числа строк."
Отправлено pavlinux , 09-Май-11 15:57 
> Привет всем.
> Стоит 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

как-то так


"Скрипт для обработки большого числа строк."
Отправлено LSTemp , 12-Май-11 04:25 
[cut]