30. juli 2002 - 15:20Der 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.
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?
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.
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.
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..
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.
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.