Avatar billede fixxxer Nybegynder
20. marts 2006 - 17:49 Der er 12 kommentarer og
1 løsning

Performence ved CRC32

Jeg forsøger at finde CRC32 checksumen af en masse filer. Problemet er at det tager overordenligt meget tid at læse indholdet af hver fil ind i en variabel, for derefter at finde CRC checksummen.

Er der nogen der har en idé til hvordan jeg kan booste performencen ved læsning af filen, programmeringsvis?

    function content_crc($file)
    {
          //tager alt for lang tid hvis der bare er mere end 10-15 filer
      $crc = crc32(file_get_contents($file_string));
      return sprintf("%u", $crc);
    }

http://dk.php.net/crc32
Avatar billede fixxxer Nybegynder
20. marts 2006 - 17:50 #1
Copy/paste bøf..

    function content_crc($file)
    {
          //tager alt for lang tid hvis der bare er mere end 10-15 filer
      $crc = crc32(file_get_contents($file));
      return sprintf("%u", $crc);
    }
Avatar billede Slettet bruger
20. marts 2006 - 18:45 #2
Hvilket operativsystem kører webserveren på?
Avatar billede fixxxer Nybegynder
20. marts 2006 - 18:52 #3
RedHat 7.3
Avatar billede arne_v Ekspert
20. marts 2006 - 20:12 #4
jeg tror ikke paa at selve CRC32 beregningen tager lang tid paa moderne
hardware

men det tager tid at laese store filer og det er det nok svaert at goere noget ved

hvis du vil speede op, saa noejes med at lave CRC af filnavn+stoerrelse+tidsstempler

hvis det er ikke mange men store filer og du vil checke lidt bedre saa tage ogsaa de
foerste 1024 byte og de sidste 1024 byte med

hvis du skal checksumme hele filen saa skal hele filen laeses
Avatar billede fixxxer Nybegynder
20. marts 2006 - 20:19 #5
Ja det er jo netop det, det er selve indholdet i filen jeg vil have en checksum af.

For tanken er at filnavnet kan være hvad som helst, men at den stadig kan identificers ud fra dens CRC checksum..

Det er filer der fylder omkring 2-6 MB stykket.
Avatar billede pidgeot Nybegynder
20. marts 2006 - 20:21 #6
En test jeg lavede for noget tid siden viste at en CRC32 af sådan en fil tog ~½ sekund, hvis ikke lidt mindre - vel og mærke gennem PHP.

Du kan overveje at få lavet et lile program til at udregne CRC'en af en fil for dig, hvilket måske kan få det til at køre en lille smule hurtigere - men jeg tror det vil være rimeligt minimalt.
Avatar billede arne_v Ekspert
20. marts 2006 - 20:26 #7
det koster tid at laese 2-6 MB data uanset hvad

hvis filens stoerelse + tids stempel + foerste 1000 byte + 1000 sidste byte er
ens, er der saa ikke en paen chance for at filerne faktisk er ens ?
Avatar billede fixxxer Nybegynder
20. marts 2006 - 21:56 #8
Nu lykkedes det mig at lave et CRC hvor jeg kun tager de første 8192 byte og de sidste 1024 byte af filen, hvilket skærer dramatisk meget af læsningstiden ned, og stadig giver unikke CRC checksums.

Nu står jeg så i den situation at jeg har 4 filer der er forskellige, men lige præcis deres header (da det er MP3 filer) er ens, hvilket giver dem ens CRC checksum.

Er der nogen der ved hvordan jeg kan læse mig frem til hvornår MP3-filens header slutter og det egenlig unikke data starter?
Avatar billede fixxxer Nybegynder
20. marts 2006 - 22:11 #9
Men dog, jeg havde allerede gang i et ID3-tag script til PHP, der kunne finde det for mig.

Jeg synes at arne_v fik mig på rette vej, så kan jeg bede om et svar fra ham?
Avatar billede pidgeot Nybegynder
20. marts 2006 - 22:12 #10
Jeg lavede en ID3v2 reader i Delphi for noget tid siden - kan lige prøve at se hvordan det format var, men du bliver lige nødt til selv at få det konverteret.
Avatar billede arne_v Ekspert
20. marts 2006 - 22:19 #11
svar
Avatar billede pidgeot Nybegynder
20. marts 2006 - 22:29 #12
Kan desværre ikke lige finde den reader lige nu, men du kan se formatet på http://www.id3.org/id3v2.4.0-structure.txt. Det er ikke så kompliceret, så det burde ikke være det store problem at finde ud af det.
Avatar billede fixxxer Nybegynder
21. marts 2006 - 00:10 #13
Den script-pakke jeg bruger klarer alle ting omkring ID3 tags fint, både version 1 og version 2. http://getid3.sourceforge.net/

Nu har jeg i mellemtiden fundet ud af at der findes MP3 filer, hvis indhold består af en masse zero bytes, skrevet af, den i sin tids encoders ID3-tag writter. Dvs at når jeg beder om de sidste fx 1024 bytes, får jeg blot en masse nul bytes tilbage, som jo naturligvis giver samme CRC checksum - suk.

Jeg kan heldigvis se at der er tale om ganske få filer med denne skavank, og at jeg nemt kan detektere dem, og køre dem gennem en re-encoding + re-id3 write, så skulle problemet blive løst..
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
Vi tilbyder markedets bedste kurser inden for webudvikling

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