Avatar billede whynot Nybegynder
30. juli 2002 - 15:20 Der er 10 kommentarer og
1 løsning

optimering af gennemløb i logfil

Jeg står overfor at skulle gennemløbe flere log filer som hver især er flere hundrede Mb stykket. Da disse, nærmest dagligt, skal gennemløbes for generering af statistik er det vigtigt for mig at proceduren er optimeret bedst muligt.

Jeg har endnu ikke algoritmen klar.. men jeg tænkte på om der var nogle som kunne give mig hints/løsninger på optimering af kode mht. tidskompleksitet så gennemløb af en STOR/LANG logfil kan ske så hurtigt som muligt.

Jeg har tænkt mig at scriptet skal køres på en linux-ting/server - så den den kan tykke sig igennem logfilerne i hjørnet. Jeg vil sikkert anvende PHP - men jeg er åben overfor andre forslag.

Mvh
René
Avatar billede jakoba Nybegynder
30. juli 2002 - 15:48 #1
det hurtigst er nok at lave akkumulerende arrays der for hver linie kan opdateres med info fra den linie.
det bliver så

// initier arrays.

$fp = fopen( "filnavn.log", "r" )
while( $linie=fgets( $fp, 500 ) {
    // opdater arrays med data fra den linie
}
fclose( $fp );

// åben statistik-db og opdater med data fra arrays.

men det kommer vel også meget an på hvilke data du vil trække ud af de logfiler.

mvh JakobA
Avatar billede jakoba Nybegynder
30. juli 2002 - 15:48 #2
Ups. mangler en ) i while linien.
Avatar billede whynot Nybegynder
30. juli 2002 - 20:21 #3
Jeg tror jeg glemte at fortælle at jeg ikke kan regne med at logfilerne er identitiske af indhold.. det eneste fælles træk er stukturen.. Men det er vel også meget normalt for en logfil.

Så det du foreslår er at gemme hvér linie i hver celle i et array!
..giver det ikke mindst to gennemløb?.. et når array'et bliver fyldt og et andet når det lægges over i databasen... det lyder ikke særlig smart - i mine øre.

Kan det hele ikke gøres i en og samme gennemkørsel?.. jeg spørger fordi tidskompleksitet er alt afgørende.. hvad er hurtigst at afvikle?
Avatar billede jakoba Nybegynder
30. juli 2002 - 20:32 #4
Nej. med så store logviler vil det fulde alt for meget at gemme alle linier i memory. Forslaget er at akkumulere de statistiske data du ønsker i de arrays.

fx et af de arrays hedder $reterres

$referrers = array();

hvergang en linie i logfilen viser en henvisning udefra checker du så om
$referrers['den IP'] findes. hvis den ikke findes sættes $referrers['den IP'] til 1; hvis den findes tælles værdien i $referrers['den IP'] 1 op.

så hvor du før havede 500 linier om referrals fra '192.57.12.5' ender du med at have en tabelcelle $referrers['192.57.12.5'] der fortæller der er blevet henvist derfra 500 gange.

på lignende måde akkumuleres andre data fra logfilen. Men det er pokkers svært at være konkret uden af vide hvilke dat der skal hentes fra hvilke linieformater, osv osccv.

mvh JakobA
Avatar billede whynot Nybegynder
30. juli 2002 - 22:47 #5
Jeg synes godt om dit eksempel - det giver pludselig meget mere mening.. og det lyder også som en rigtig god idé..  men hvordan ligger det med tidskompleksiteten for gentagende kald i et array contra en database med sql-statements.. min tanke kunne være at flytte data over i en database i stedet for et array.. - såfremt der er noget at spare af tid altså.

Det er monster vigtigt at anvende de teknologier/kald som kræver mindst mulig processortid.
Avatar billede whynot Nybegynder
30. juli 2002 - 22:49 #6
Hvis du iøvrigt gerne vil vide hvilken type logfil som skal gennemløbes er det blandt andet SMF record type 70 til 79 fra en mainframe som køre med z/OS. Jeg skal blandt andet gennemløbe for hvilke processer som fik processertid i tidspunkt 1, 2,3,4..osv..
Avatar billede jakoba Nybegynder
30. juli 2002 - 23:01 #7
ved php kører dataqbasen i en separat server der så skal swithes til og tilbage fra ved enhver database query. arrays er MEGET hurtigere.
Avatar billede jakoba Nybegynder
30. juli 2002 - 23:06 #8
Det sagt ville det blive endnu hurtigere hvis du lavede et C-program til at analysere logfilerne. et compileret sprog som C er et par størrelsesordner hurtigere end et scriptsprog som php.
Avatar billede whynot Nybegynder
02. august 2002 - 07:33 #9
Hvor store kan arrays være i PHP kontra C?

Vil det være hurtigere at lave "while not eof do - læg data over i database tupler" og derefter køre resten med sql..?

Er sql hurtigere?
Avatar billede jakoba Nybegynder
02. august 2002 - 09:37 #10
Jeg aner ikke hvor store arrays kan være.

Det vil under ale omstændigheder være en dum ide at læse hele filenen ind i RAM memory når filen er så stor. den skal komprimeres ned imens der læses.

sql betyder der benyttes database og det er dermed langsommere end arrays.

mvh JakobA
Avatar billede whynot Nybegynder
02. juli 2003 - 23:11 #11
hmmm jeg giver op.!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester