The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Скрипт для обработки большого числа строк."
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (Shell скрипты)
Изначальное сообщение [ Отслеживать ]

"Скрипт для обработки большого числа строк."  +/
Сообщение от shc0d3r email(ok) on 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!"

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

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Скрипт для обработки большого числа строк."  +/
Сообщение от Andrey Mitrofanov on 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()}' ...

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

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

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

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

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

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

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

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

6. "Скрипт для обработки большого числа строк."  +/
Сообщение от ACCA (ok) on 06-Май-11, 18:08 
head -n 1304452799 < access.log > access.log_new

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

Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

4. "Скрипт для обработки большого числа строк."  +/
Сообщение от Andrey Mitrofanov on 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

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

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


Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

5. "Скрипт для обработки большого числа строк."  +/
Сообщение от gpl77 (ok) on 06-Май-11, 17:51 

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

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

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

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

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

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

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

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

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

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

Те же грабли.

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

Ответить | Правка | ^ к родителю #5 | Наверх | Cообщить модератору

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

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

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

Ответить | Правка | ^ к родителю #7 | Наверх | Cообщить модератору

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

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

Ответить | Правка | ^ к родителю #8 | Наверх | Cообщить модератору

10. "Скрипт для обработки большого числа строк."  +/
Сообщение от pavlinux (ok) on 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

как-то так

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

11. "Скрипт для обработки большого числа строк."  +/
Сообщение от LSTemp (ok) on 12-Май-11, 04:25 
[cut]

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру