[PERL] ускорить скрипт

И всё прочее, что касается HTML
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Гость
проходил мимо

Re: [PERL] ускорить скрипт

Непрочитанное сообщение Гость » 2009-03-15 15:27:55

можно использовать хэш хэшей. накатал пример, где один раз проходим по массиву @tmp и собираем собственно сам хэш, потом проходим по @list_proc и записываем всю инфу по юзерам, потом проходим по всем ключам хэша и записываем в файл. вроде как очень быстро получилось.

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35462
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: [PERL] ускорить скрипт

Непрочитанное сообщение Alex Keda » 2009-03-15 16:31:07

пример покажите? =)
Убей их всех! Бог потом рассортирует...

Гость
проходил мимо

Re: [PERL] ускорить скрипт

Непрочитанное сообщение Гость » 2009-03-15 17:22:57

конечно.

Код: Выделить всё

#!/usr/bin/perl -w

use strict;   # в манах пишут, что так надо

#$txt_bases_preffix="/var/db/resusage/txt/" . print_year(time()) . "/" . print_month(time()) . "/" . print_day(time());
#print_date у вас же есть уже...

my $txt_bases_preffix="/var/db/resusage/txt/" . print_date(time());

# проверяем наличие директории, если надо - создаём.
if ( -d $txt_bases_preffix ){ # есть директория
}else{  # есть директория --> нет директории
        `/bin/mkdir -m 0751 -p $txt_bases_preffix`
}

# /bin/ps -axo user,%cpu,%mem | /usr/bin/awk '{print $1, $2, $3}' | /usr/bin/sort
open (MYPS, "/bin/ps -axo user,%cpu,%mem |");
my @list_proc = <MYPS>;
close MYPS;

# grep Account /usr/local/ispmgr/etc/ispmgr.conf | awk '{print $2}' | sed 's/"//g'
open (MYTMP, "/usr/local/ispmgr/etc/ispmgr.conf");
my @tmp = <MYTMP>;
close MYTMP;

my %HoH;  # заводим хэш

# Создаём хэш для каждого юзера
foreach (@tmp) {
    (my $tmp1, my $user_name) = split('\s', $_);
    if($tmp1 eq "Account") {
        if($user_name =~/^"h\d+"$/) {
            $user_name =~ s/\"//g;
	    $HoH{$user_name}{'cpu'} = 0;
	    $HoH{$user_name}{'ram'} = 0;
	    $HoH{$user_name}{'proc'} = 0;
	}
    }
}

# заполняем поля хэша для каждого юзера
foreach (@list_proc) {
    my $cpu = 0;
    my $ram = 0;
    my $proc = 0;

# слегка переделал функцию trim. у вас было в функции trim: return unless $string...
# в конце if тоже самое делает, только не происходит вызова функции trim и не делается split пустоты...
    (my $tmp_user, my $tmp_cpu, my $tmp_ram) = split('\s+', trim($_)) if $_;

# это переделанная if($tmp_user eq $user_name){
    if (defined($HoH{$tmp_user}{'cpu'})) {
    $HoH{$tmp_user}{'cpu'} += $tmp_cpu;
    $HoH{$tmp_user}{'ram'} += $tmp_ram;
    $HoH{$tmp_user}{'proc'} += 1;
    }
}

# собственно, вывод данных
foreach (keys %HoH) {
    print $HoH{$_}{'cpu'}." ".$HoH{$_}{'ram'}." ".$HoH{$_}{'proc'}."\n" if (defined($HoH{$_}{'cpu'}));
}

sub trim {
        my($string)=@_;
# чутка убыстрить можно
#        return $string unless $string;
#        for ($string) {
#                s/^\s+//;
#                s/\s+$//;
#        }
        $string =~ s/^\s+//;
        $string =~ s/\s+$//;
        return $string;
}
у меня, правда, нет ispmgr'a... так что проверить 100% работу я не смог. так что проверка проводилась на парсинге httpd.conf :D

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35462
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: [PERL] ускорить скрипт

Непрочитанное сообщение Alex Keda » 2009-03-15 17:35:04

ближе к ночи попробую =)
пасиба!
Убей их всех! Бог потом рассортирует...

Гость
проходил мимо

Re: [PERL] ускорить скрипт

Непрочитанное сообщение Гость » 2009-03-15 23:00:33

нз. отпишитесь потом, плз, о результатах. мне ж инетересно заработает ли как надо или нет :)

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35462
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: [PERL] ускорить скрипт

Непрочитанное сообщение Alex Keda » 2009-03-15 23:34:50

Код: Выделить всё

$HoH{$tmp_user}{'p{'ram'}." ".$HoH{$_}{'proc'}."\n" if (defined($HoH{$_}{'cpu'}));
эта строка не нравиться.
ругается так:

Код: Выделить всё

Bad name after ram' at /tmp/1.pl line 55.
я не понимаю что она делает - поэтому поправить не смог =))
напишите попроще, пусть даже помедленней =)))
Убей их всех! Бог потом рассортирует...

Гость
проходил мимо

Re: [PERL] ускорить скрипт

Непрочитанное сообщение Гость » 2009-03-16 0:11:58

Код: Выделить всё

    $HoH{$tmp_user}{'p{'ram'}." ".$HoH{$_}{'proc'}."\n" if (defined($HoH{$_}{'cpu'}));
чё-то странная строка какая-то... не пойму точно откуда она взялась. мб вы скопировали с ошибкой. хорошо бы, если бы вы приложили предыдущие 3 строки и следующие 3 строки, которые находятся в окрестности ошибочной строчки.

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: [PERL] ускорить скрипт

Непрочитанное сообщение ProFTP » 2009-03-16 0:42:42

доступ в к массивам осуществляется быстрее чем к хэшам, начем тут строить хэш таблицу?
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

Гость
проходил мимо

Re: [PERL] ускорить скрипт

Непрочитанное сообщение Гость » 2009-03-16 0:52:57

с хэшем мне показалось проще это реализовать(кстати, начал перл изучать где-то неделю назад :) ). да и по времени, вроде как, у меня выполнилось оно быстрее, чем изначальный код.

пс. последний код можно ускорить(если к хэшам медленее обращаться). можно было бы, сделать хэш массивов, где ключи хэша - имена пользователей, а value указывал бы на массив([0] - cpu, [1] - ram, [2] - proc).. ну это так.. к слову.

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35462
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: [PERL] ускорить скрипт

Непрочитанное сообщение Alex Keda » 2009-03-16 0:56:48

> # собственно, вывод данных
это отсюда
Убей их всех! Бог потом рассортирует...

Гость
проходил мимо

Re: [PERL] ускорить скрипт

Непрочитанное сообщение Гость » 2009-03-16 1:05:56

вот так выглядит вывод данных:

Код: Выделить всё

foreach (keys %HoH) {
    print $HoH{$_}{'cpu'}." ".$HoH{$_}{'ram'}." ".$HoH{$_}{'proc'}."\n" if (defined($HoH{$_}{'cpu'}));
}
вы сказали, что ошибка здесь:

Код: Выделить всё

             $HoH{$tmp_user}{'p{'ram'}." ".$HoH{$_}{'proc'}."\n" if (defined($HoH{$_}{'cpu'}));
вообще, там ничё сложного... просто идёт вывод(print) значений хэша: $HoH{$_}{'cpu'}, ... $_ - это переменная, в которую записывает перл каждый элемент массива, который возвращает функция keys(%HoH).

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: [PERL] ускорить скрипт

Непрочитанное сообщение ProFTP » 2009-03-16 1:18:34

я так и не понял что именно хочет автор топика, но 0.7 сек. наверное нормально?

вот так еще можно сделать хэши через ссылку:

Код: Выделить всё

perl -MData::Dumper -0x0a -lne '%hash = ( %hash, split "\t" ); END { print Dumper \%hash }' file
если он записывает 200 файлов и парси в них, то можно разделить их на потоки, то есть они запишутся быстрее... но надо пробовать тестирповать
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

Аватара пользователя
hizel
дядя поня
Сообщения: 9032
Зарегистрирован: 2007-06-29 10:05:02
Откуда: Выборг

Re: [PERL] ускорить скрипт

Непрочитанное сообщение hizel » 2009-03-16 9:25:05

В дурацкие игры он не играет. Он просто жуткий, чу-чу, паровозик, и зовут его Блейн. Блейн --- это Боль.

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: [PERL] ускорить скрипт

Непрочитанное сообщение ProFTP » 2009-03-16 9:27:32

что это даст?

напишет где медленно работает?

вот еще есть:
http://search.cpan.org/~thaljef/Perl-Cr ... /Critic.pm
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение

Аватара пользователя
ProFTP
подполковник
Сообщения: 3388
Зарегистрирован: 2008-04-13 1:50:04
Откуда: %&й
Контактная информация:

Re: [PERL] ускорить скрипт

Непрочитанное сообщение ProFTP » 2009-03-16 10:46:48

лисяра, если хочешь спросит тут
http://forum.vingrad.ru/forum/perl-syst ... mming.html

может сходу кто-то скажет...
Pеrl FAQ
perl -e 'print join"",map $$_[rand@$_],([0..9,'a'..'z','A'..'Z'])x30'
ИзображениеИзображение