[PERL] ускорить скрипт
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
-
- проходил мимо
Re: [PERL] ускорить скрипт
можно использовать хэш хэшей. накатал пример, где один раз проходим по массиву @tmp и собираем собственно сам хэш, потом проходим по @list_proc и записываем всю инфу по юзерам, потом проходим по всем ключам хэша и записываем в файл. вроде как очень быстро получилось.
Услуги хостинговой компании Host-Food.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/
Тарифы на виртуальные сервера (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
- стреляли...
- Сообщения: 35426
- Зарегистрирован: 2004-10-18 14:25:19
- Откуда: Made in USSR
- Контактная информация:
-
- проходил мимо
Re: [PERL] ускорить скрипт
конечно.
у меня, правда, нет ispmgr'a... так что проверить 100% работу я не смог. так что проверка проводилась на парсинге httpd.conf 
Код: Выделить всё
#!/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;
}

- Alex Keda
- стреляли...
- Сообщения: 35426
- Зарегистрирован: 2004-10-18 14:25:19
- Откуда: Made in USSR
- Контактная информация:
-
- проходил мимо
Re: [PERL] ускорить скрипт
нз. отпишитесь потом, плз, о результатах. мне ж инетересно заработает ли как надо или нет 

- Alex Keda
- стреляли...
- Сообщения: 35426
- Зарегистрирован: 2004-10-18 14:25:19
- Откуда: Made in USSR
- Контактная информация:
Re: [PERL] ускорить скрипт
Код: Выделить всё
$HoH{$tmp_user}{'p{'ram'}." ".$HoH{$_}{'proc'}."\n" if (defined($HoH{$_}{'cpu'}));
ругается так:
Код: Выделить всё
Bad name after ram' at /tmp/1.pl line 55.

напишите попроще, пусть даже помедленней

Убей их всех! Бог потом рассортирует...
-
- проходил мимо
Re: [PERL] ускорить скрипт
Код: Выделить всё
$HoH{$tmp_user}{'p{'ram'}." ".$HoH{$_}{'proc'}."\n" if (defined($HoH{$_}{'cpu'}));
- ProFTP
- подполковник
- Сообщения: 3388
- Зарегистрирован: 2008-04-13 1:50:04
- Откуда: %&й
- Контактная информация:
Re: [PERL] ускорить скрипт
доступ в к массивам осуществляется быстрее чем к хэшам, начем тут строить хэш таблицу?
-
- проходил мимо
Re: [PERL] ускорить скрипт
с хэшем мне показалось проще это реализовать(кстати, начал перл изучать где-то неделю назад
). да и по времени, вроде как, у меня выполнилось оно быстрее, чем изначальный код.
пс. последний код можно ускорить(если к хэшам медленее обращаться). можно было бы, сделать хэш массивов, где ключи хэша - имена пользователей, а value указывал бы на массив([0] - cpu, [1] - ram, [2] - proc).. ну это так.. к слову.

пс. последний код можно ускорить(если к хэшам медленее обращаться). можно было бы, сделать хэш массивов, где ключи хэша - имена пользователей, а value указывал бы на массив([0] - cpu, [1] - ram, [2] - proc).. ну это так.. к слову.
- Alex Keda
- стреляли...
- Сообщения: 35426
- Зарегистрирован: 2004-10-18 14:25:19
- Откуда: Made in USSR
- Контактная информация:
Re: [PERL] ускорить скрипт
> # собственно, вывод данных
это отсюда
это отсюда
Убей их всех! Бог потом рассортирует...
-
- проходил мимо
Re: [PERL] ускорить скрипт
вот так выглядит вывод данных:
вы сказали, что ошибка здесь:
вообще, там ничё сложного... просто идёт вывод(print) значений хэша: $HoH{$_}{'cpu'}, ... $_ - это переменная, в которую записывает перл каждый элемент массива, который возвращает функция keys(%HoH).
Код: Выделить всё
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'}));
- ProFTP
- подполковник
- Сообщения: 3388
- Зарегистрирован: 2008-04-13 1:50:04
- Откуда: %&й
- Контактная информация:
Re: [PERL] ускорить скрипт
я так и не понял что именно хочет автор топика, но 0.7 сек. наверное нормально?
вот так еще можно сделать хэши через ссылку:
если он записывает 200 файлов и парси в них, то можно разделить их на потоки, то есть они запишутся быстрее... но надо пробовать тестирповать
вот так еще можно сделать хэши через ссылку:
Код: Выделить всё
perl -MData::Dumper -0x0a -lne '%hash = ( %hash, split "\t" ); END { print Dumper \%hash }' file
- hizel
- дядя поня
- Сообщения: 9032
- Зарегистрирован: 2007-06-29 10:05:02
- Откуда: Выборг
Re: [PERL] ускорить скрипт
В дурацкие игры он не играет. Он просто жуткий, чу-чу, паровозик, и зовут его Блейн. Блейн --- это Боль.
- ProFTP
- подполковник
- Сообщения: 3388
- Зарегистрирован: 2008-04-13 1:50:04
- Откуда: %&й
- Контактная информация:
Re: [PERL] ускорить скрипт
что это даст?
напишет где медленно работает?
вот еще есть:
http://search.cpan.org/~thaljef/Perl-Cr ... /Critic.pm
напишет где медленно работает?
вот еще есть:
http://search.cpan.org/~thaljef/Perl-Cr ... /Critic.pm
- ProFTP
- подполковник
- Сообщения: 3388
- Зарегистрирован: 2008-04-13 1:50:04
- Откуда: %&й
- Контактная информация:
Re: [PERL] ускорить скрипт
лисяра, если хочешь спросит тут
http://forum.vingrad.ru/forum/perl-syst ... mming.html
может сходу кто-то скажет...
http://forum.vingrad.ru/forum/perl-syst ... mming.html
может сходу кто-то скажет...