XiBlue Posted June 5, 2003 Posted June 5, 2003 Вот тут вчера наваял может кому интерестно. На релкоме можно брать свою статистику, но она в таком непотребном виде (видели наверно). Вот она ее и разгребает немного. Работает немного медленно, но просто у меня база большая была, да и сервачок так себе. Под виндой работает, только подправить надо немного. Комментарии: Использую DB_File что бы в память все не грузить (у меня база была 42Мб, 528000 строк!!!). Я еще сваял из кусков других своих старых программ, так что не обращайте внимание на разные места и т.д. Времени не было. #! /usr/bin/perl # Writen By XiBlue 04.06.2003 (xiblue@usm.ur.ru) use DB_File; $dir="/root/r"; $file="$dir/traf-200305"; $trafdb="$dir/traf-200305.db"; $DB_RECNO= new DB_File::RECNOINFO; $DBTRAF_RECNO= new DB_File::RECNOINFO; $DB=tie(@BASE,"DB_File","$file",O_RDWR|O_CREAT,0666,$DB_RECNO); $DBTRAF=tie(@TRAFBASE,"DB_File","$trafdb",O_RDWR|O_CREAT,0666,$DBTRAF_RECNO); $sizedb=$DB->length; print "$sizedbn"; $newi=0; for ($i=0;$i<$sizedb;$i++) { ($ipfrom,$ipto,$p,$bytes,$s,$t)=split(/s+/,$BASE[$i]); if ($newi eq $i) { print "$in";$newi=$newi+1000; if ($i>0) { untie(@TRAFBASE); $DBTRAF=tie(@TRAFBASE,"DB_File","$trafdb",O_RDWR|O_CREAT,0666,$DBTRAF_RECNO); } } &line_oper($BASE[$i]); } untie(@BASE); untie(@TRAFBASE); exit; sub line_oper { my ($self)=shift;$line=$self; $tmp=substr($line,0,1);if ($tmp eq '#') {return;} ($ipfrom,$ipto,$p,$bytes,$s,$t)=split(/s+/,$line); ($m,$scheme)=split(/=/,$s); if ($scheme eq 'city') {base_oper($ipto,$bytes,0,0);} if ($scheme eq 'game') {base_oper($ipto,0,$bytes,0);} if ($scheme eq 'ext') {base_oper($ipto,0,0,$bytes);} return; } sub base_oper { my ($ip,$city,$game,$world,$sizedb,$i,$markdb); my ($self)=shift;$ip=$self; my ($self)=shift;$city=$self; my ($self)=shift;$game=$self; my ($self)=shift;$world=$self; $sizedb=$DBTRAF->length;$markdb=0; for ($i=0;$i<$sizedb;$i++) { ($db_ip,$db_city,$db_game,$db_world)=split(/ /,$TRAFBASE[$i]); if ($db_ip eq $ip) { $db_city+=$city; $db_game+=$game; $db_world+=$world; $TRAFBASE[$i]="$db_ip $db_city $db_game $db_world"; } else {$markdb++;} } if ($markdb == $sizedb) {$TRAFBASE[$sizedb]="$ip $city $game $world";} return; } Вставить ник Quote
Nicky Posted August 15, 2003 Posted August 15, 2003 528 000 строк это немного :) Всасывается за пару минут в память Вставить ник Quote
XiBlue Posted September 2, 2003 Author Posted September 2, 2003 Я же говорю, машинка под линухом была так себе. 300 целерон, 256 памяти. Нагрузка постоянная около 40%. Нагружать нехотелось. Я чуть позже еще считал, другой месяц. Только уже на 2000 целероне, 256 памяти, под виндой. Просчитало в 10 раз быстрее. Ту машинку сколько угодно можно было нагружать.... Вставить ник Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.