Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обработка лог-файла. определение максимального кол-во пользов 
:(
    Опции темы
jerryk
Дата 5.10.2010, 21:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 5.10.2010

Репутация: нет
Всего: нет



Есть исходный лог файл:
                              JOB         JOB            JOB     USER
  TIMESTAMP                   NAME        USER          NUMBER  PROFILE
  --------------------------  ----------  ----------  --------  

----------
  2010-08-05-01.29.46.371792  PK12        USDFRI      676,559   USDFRI    
  2010-08-05-05.29.29.728160  PK12        USDFRI      676,548   USDFRI      
  2010-08-05-05.37.55.225248  PK12        USDFRI      677,131   USDFRI      
  2010-08-05-05.38.59.297712  PK606       ONOUOU      677,130   ONOUOU      
  2010-08-05-05.40.46.528384  PK667       CRETVY      677,147   CRETVY      
  2010-08-05-05.41.28.027632  PK606       ONOUOU      677,152   ONOUOU      
  2010-08-05-05.41.38.743824  PK606       ONOUOU      677,157   ONOUOU     
  2010-08-05-05.41.45.233696  PK436       DFG557N     677,163   DFG557N

 нужно только эти два столбца(файл уже распотрошил):
2010-08-05-01.29.46.371792;USDFRI      
2010-08-05-05.29.29.728160;USDFRI      
2010-08-05-05.37.55.225248;USDFRI      
2010-08-05-05.38.59.297712;ONOUOU      
2010-08-05-05.40.46.528384;CRETVY      
2010-08-05-05.41.28.027632;ONOUOU      
2010-08-05-05.41.38.743824;ONOUOU      
2010-08-05-05.41.45.233696;DFG557N
На выходе надо получить таблицу с максимальным количеством уникальных 
пользователей за период:минуту, две, и тд. до 9часов.
Время выхода мы не знаем.
вот такого плана:
период;максимальное кол-во пользователей
1;4
2;4
3;5
4;6
5;6
..
9часов;n
Заранее спасибо!

Это сообщение отредактировал(а) jerryk - 5.10.2010, 21:25
PM MAIL   Вверх
Jimy
Дата 6.10.2010, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 4.7.2010

Репутация: нет
Всего: 3



Во-первых. Для данной задачи, на мой взгляд, удобнее использовать время не в полном формате, а преобразовать в дельту (например, в секундах) относительно предыдущей записи.
Т.е. вместо, например:
2010-08-05-05.29.29.728160;USDFRI      
2010-08-05-05.37.55.225248;USDFRI      
2010-08-05-05.38.59.297712;ONOUOU

сделать что-то типа:
0;USDFRI      
505.5;USDFRI
64.07;ONOUOU

Поскольку Вы лог предварительно обрабатываете, то это сделать не сложно.

Подсчет количества уникальных профилей в единицу времени я бы реализовал так:
Код

my $period = 60; # период для которого нужно найти максимальное количество пользователей, в секундах
my @logs;   # массив для накопления строк лога входящих в период
my %profiles;   # хэш для подсчета пользователей
my $time; # дельта времени между первой и последней записью в массиве @logs
my $cnt;  # количество строк лога, попадающих в заданный период
my $maxProfiles; # искомая величина для заданного периода

while ($line = <LOG>) {
    my ($delta, $profile) = split(';', $line);
    push @logs, {'delta' => $delta, 'profile' => $profile}; # массив, содержащий строки входящие в заданный диапазон
    $profiles{$profile} ++;
    $cnt ++;
    if ($cnt > 1) { $time += $delta; } # в диапазон может входить не менее 2-х значений
    while ($time > $period) { #  если новая запись лога, переполняет заданный период
        if ($profiles{$logs[0]->{'delta'}} > 1) {
            $profiles{$logs[0]->{'delta'}} --; # уменьшаем счетчик пользователей
        } else {
            delete $profiles{$logs[0]->{'delta'}};  # удаляем пользователя из хэша если он был замечен только один раз
        }
        shift @logs; # выкидываем самую старую запись из блока
        $time -= $logs[0]->{'delta'};
        $cnt--;
    }
    my @curProfiles = keys %profiles; # массив пользователей в данный момент находящихся в @logs
    if ($maxProfiles <= $curProfiles) {
        $maxProfiles = $curProfiles + 1;
    }
}
print $maxProfiles;


меняя $period, получим нужные значения максимального количества профилей $maxProfiles
Также можно преобразовать код для того чтобы посчитать сразу все периоды за один проход лога. Для этого нужно завести отдельные наборы переменных для каждого периода.

P.S. Приведенный код не тестировал, поэтому возможны ошибки а также опечатки. Но общий принцип думаю из него понятен.
Также не исключаю существования более эффективного способа (по расходу памяти и других ресурсов) smile
PM   Вверх
jerryk
Дата 7.10.2010, 10:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 5.10.2010

Репутация: нет
Всего: нет



Спасибо большое!
Но почемуто все время выдает единицу.
PM MAIL   Вверх
Jimy
Дата 7.10.2010, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 4.7.2010

Репутация: нет
Всего: 3



Код

    if ($maxProfiles <= $#curProfiles) {
        $maxProfiles = $#curProfiles + 1;
    }

пропустил решетки
PM   Вверх
jerryk
Дата 7.10.2010, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 5.10.2010

Репутация: нет
Всего: нет



Да с решетками заработало, только код считает общее(весь лог) максимальное кол-во пользователей, т.к. дельта относительно предыдущей записи получатся меньше 60..... 
PM MAIL   Вверх
Jimy
Дата 7.10.2010, 22:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 4.7.2010

Репутация: нет
Всего: 3



Цитата(jerryk @ 7.10.2010,  19:51)
только код считает общее(весь лог) максимальное кол-во пользователей

Как спросили, так и ответил. В вопросе не было сказано, нужно ли обрабатывать весь лог или только его часть.
PM   Вверх
Jimy
Дата 8.10.2010, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 4.7.2010

Репутация: нет
Всего: 3



в этом блоке тоже ошибся:
Код

        if ($profiles{$logs[0]->{'profile'}} > 1) {
            $profiles{$logs[0]->{'profile'}} --; # уменьшаем счетчик пользователей
        } else {
            delete $profiles{$logs[0]->{'profile'}};  # удаляем пользователя из хэша если он был замечен только один раз
        }

PM   Вверх
jerryk
Дата 11.10.2010, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 5.10.2010

Репутация: нет
Всего: нет



Цитата(Jimy @ 7.10.2010,  22:58)
Цитата(jerryk @ 7.10.2010,  19:51)
только код считает общее(весь лог) максимальное кол-во пользователей

Как спросили, так и ответил. В вопросе не было сказано, нужно ли обрабатывать весь лог или только его часть.

Все правильно обрабатывать надо весь лог.
Сорри, все отлично еще раз спасибо!

Это сообщение отредактировал(а) jerryk - 11.10.2010, 11:49
PM MAIL   Вверх
DEER
Дата 12.10.2010, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 749
Регистрация: 12.4.2005
Где: г. Рязань

Репутация: 1
Всего: 13



Цитата(Jimy @ 7.10.2010,  11:42)
Код

    if ($maxProfiles <= $#curProfiles) {
        $maxProfiles = $#curProfiles + 1;
    }

пропустил решетки

а что за решетки? где почитать?


--------------------
 
PM MAIL WWW ICQ MSN   Вверх
maxgray
Дата 12.10.2010, 05:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 6.5.2010

Репутация: нет
Всего: нет



Цитата(DEER @ 12.10.2010,  00:05)
а что за решетки? где почитать?

Это индекс последнего элемента массива.
PM MAIL   Вверх
JavaCraft
Дата 10.11.2010, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 8.2.2007

Репутация: нет
Всего: 1



Я так понимаю, юзеры в базе уже хранятся, не проще(правильнее) через базу? Обычный запрос с агрегацией.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1029 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.