[du] Wat telt dat eigenlijk?

Pagina: 1
Acties:

  • Steven
  • Registratie: December 2000
  • Laatst online: 08-05 23:25
jaja, ik weet het, het geeft de grote van een directory weer, maar hoe doet het dat dan?

Als ik namelijk met een scriptje (maar ook handmatig) de grootte van alle bestanden in een directory bijelkaar optel, en dan eventueel nog + 4KB doe aangezien dat de grote van de directory zelf is kom ik altijd op een lager getal uit.

Dit is nogal essentieel voor een diskusage php script waarbij ik geen du kan gebruiken. Dus wie weet hoe du telt, telt het misschien de blocks die een file gebruikt en vermenigvuldigt hij die met de blocksize? (hoe groot is die eigenlijk met EXT2?)

  • Rataplan
  • Registratie: Oktober 2001
  • Niet online

Rataplan

per aspera ad astra

Nou, je hebt zelf het antwoord al gegeven, dus dat is lekker makkelijk :)

Disk Usage >= bestandsgrootte.

Files gebruiken altijd een geheel aantal blocks om op opgeslagen te worden, stel dat je blocksize 4KB is en je hebt tien bestandjes van 1 byte, dan ben je tien keer 4KB is 40KB kwijt.

Als je directory 4KB in beslag neemt, lijkt het me aannemelijk dat je bs 4K is. Hoe je werkelijk kan zien wat je bs is weet ik niet, wel hoe je het kan bepalen: maak een lege directory aan, vraag aan du hoeveel ruimte deze dir inneemt, plaats een bestand van 1 byte in die dir, en draai nogmaals du. Het verschil tussen de twee du-resultaten is je blocksize ;) [edit:]Voor ext2 zijn trouwens verschillende blocksizes mogelijk, 1K tot 4K is gangbaar, en ik geloof dat alles tussen 512 bytes en 16K mogelijk is, wellicht zelfs nog meer...

[ Voor 15% gewijzigd door Rataplan op 03-01-2003 18:59 ]


Journalism is printing what someone else does not want printed; everything else is public relations.


  • Steven
  • Registratie: December 2000
  • Laatst online: 08-05 23:25
aha, tnx voor je antwoord. Dus ik moet alle bestanden nog delen door 4k en dan naar boven afronden waarna ik het weer moet vermenigvuldigen met 4k?

Want de blocksize is dacht ik niet variabel zoals bij NTFS?

  • Steven
  • Registratie: December 2000
  • Laatst online: 08-05 23:25
En voor de statistieken:

PHP-Scriptje om de grote van een directory in bytes op te roepen:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function dirsize($dir, $pos=0) { 
    global $totalDirSize; 
    if($pos == 0) {
        $totalDirSize = 0;
     }
    $totalDirSize += 4096;
    $handle = @opendir($dir); 
    while ($file = @readdir ($handle)){ 
        if (eregi("^\.{1,2}$", $file)) {
            continue; 
    }
        if (is_dir($dir.$file)) { 
            dirsize("$dir$file/", $pos++); 
        } else { 
            $size=filesize($dir.$file); 
            $size = ceil($size / 4096) * 4096;
            $totalDirSize += $size; 
        } 
    } 
    @closedir($handle); 
    return($totalDirSize); 
}


Dit scriptje heeft in de praktijk af en toe een afwijking van enkele halve procenten naar beneden, ik snap niet waarom trouwens.

[ Voor 12% gewijzigd door Steven op 03-01-2003 19:22 ]


  • odysseus
  • Registratie: Augustus 2000
  • Laatst online: 14-05 20:19

odysseus

Debian GNU/Linux Sid

Nee, ext2 heeft bij mijn weten geen variabele blocksize - het is wel bij het formatteren in te stellen.

Leven is het meervoud van lef | In order to make an apple pie from scratch, you must first create the universe.


Verwijderd

Steven schreef op 03 January 2003 @ 19:20:
En voor de statistieken:
[knip code]

Dit scriptje heeft in de praktijk af en toe een afwijking van enkele halve procenten naar beneden, ik snap niet waarom trouwens.


Kijk maar eens naar de recursieve aanroep van de functie ;)

  • Steven
  • Registratie: December 2000
  • Laatst online: 08-05 23:25
Verwijderd schreef op 03 January 2003 @ 19:31:

[...]


Kijk maar eens naar de recursieve aanroep van de functie ;)
eh.... Denk... denk...
* Steven zoekt bril: B)
* Steven zoekt hamer: 8)7
* Steven ziet het niet en voelt zich erg dom... :'(

Verwijderd

Hoe roep je de functie de eerste keer aan in je code :?

Kan best zijn dat Nelske zit te blaten, omdat hij de code heel snel bekeek en er verder niet echt over nagedacht heeft hoor :P

[ Voor 55% gewijzigd door Verwijderd op 03-01-2003 19:45 ]


  • Steven
  • Registratie: December 2000
  • Laatst online: 08-05 23:25
Gewoon: dirsize("/dirnaam/");

Verwijderd

Dan heb ik niks gezegd ;)
edit:
Toch wel nog iets over die aanroep. Je wil alleen de initiele aanroep uitsluiten omdat een sub-dir (die dus recursief aangeroepen wordt) wel telt als 4 KB. Een pre-increment in de aanroep lijkt me dan handiger dan een post-increment :)


Grote kans dat het ergens in je afronding fout gaat dan :)

[ Voor 62% gewijzigd door Verwijderd op 03-01-2003 20:13 ]


  • Steven
  • Registratie: December 2000
  • Laatst online: 08-05 23:25
Verwijderd schreef op 03 januari 2003 @ 19:59:
Dan heb ik niks gezegd ;)
edit:
Toch wel nog iets over die aanroep. Je wil alleen de initiele aanroep uitsluiten omdat een sub-dir (die dus recursief aangeroepen wordt) wel telt als 4 KB. Een pre-increment in de aanroep lijkt me dan handiger dan een post-increment :)


Grote kans dat het ergens in je afronding fout gaat dan :)
Na 10 keer die zin over lezen...
Die zin mag je uitleggen, want of je zit er grandioos naast of ik snap je niet :p

Verwijderd

Steven schreef op 03 January 2003 @ 20:42:
[...]


Na 10 keer die zin over lezen...
Die zin mag je uitleggen, want of je zit er grandioos naast of ik snap je niet :p

Als $pos nul is, dan zet je $totalDirsize terug op 0. Is goed om de var in de functie de eerste keer te initieren. Wat gebeurt er echter als je in deze vorm de allereerste subdir tegenkomt :?

Hij roept recursief de functie aan met welke waarde van $pos? Nul om precies te zijn, omdat je een post-increment van die var doet i.p.v een pre-increment. Gevolg is dat je totalDirSize terug op nul gezet wordt.
Kortom het argument in de recursieve funtie-aanroep moet ++$pos zijn i.p.v. $pos++. :)

Daarnaast is elke subdir ook weer 4 KB groot en dus moet voor elke aanroep (behalve de initiele aanroep) er 4 KB bij totalDirSize opgeteld worden.

Ik heb het hier even getest en dat werkt goed. Er kwam wel aan het licht dat wat grotere bestanden inderdaad fout gaan met het afronden, waardoor je daarvoor zult moeten compenseren door je afronding met 1 te verhogen voordat je vermenigvuldigt.

Dat levert dan onderstaande code op (zonder rekening te houden met het laatste deel van mijn verhaal):

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function dirsize($dir, $pos=0) { 
    global $totalDirSize; 
    if($pos == 0) {
        $totalDirSize = 0;
    } else {
        $totalDirSize += 4096;
    }
    $handle = @opendir($dir); 
    while ($file = @readdir ($handle)){ 
        if (eregi("^\.{1,2}$", $file)) {
            continue; 
    }
        if (is_dir($dir.$file)) { 
            dirsize("$dir$file/", ++$pos); 
        } else { 
            $size=filesize($dir.$file); 
            $size = ceil($size / 4096) * 4096;
            $totalDirSize += $size; 
        } 
    } 
    @closedir($handle); 
    return($totalDirSize); 
}

[ Voor 3% gewijzigd door Verwijderd op 03-01-2003 21:05 ]


  • Steven
  • Registratie: December 2000
  • Laatst online: 08-05 23:25
Verwijderd schreef op 03 januari 2003 @ 21:02:

[...]

Als $pos nul is, dan zet je $totalDirsize terug op 0. Is goed om de var in de functie de eerste keer te initieren. Wat gebeurt er echter als je in deze vorm de allereerste subdir tegenkomt :?

Hij roept recursief de functie aan met welke waarde van $pos? Nul om precies te zijn, omdat je een post-increment van die var doet i.p.v een pre-increment. Gevolg is dat je totalDirSize terug op nul gezet wordt.
Kortom het argument in de recursieve funtie-aanroep moet ++$pos zijn i.p.v. $pos++. :)

Daarnaast is elke subdir ook weer 4 KB groot en dus moet voor elke aanroep (behalve de initiele aanroep) er 4 KB bij totalDirSize opgeteld worden.

Ik heb het hier even getest en dat werkt goed. Er kwam wel aan het licht dat wat grotere bestanden inderdaad fout gaan met het afronden, waardoor je daarvoor zult moeten compenseren door je afronding met 1 te verhogen voordat je vermenigvuldigt.

Dat levert dan onderstaande code op (zonder rekening te houden met het laatste deel van mijn verhaal):

[code knip]
Oh tuurlijk, dat had ik zelf ook kunnen bedenken :) Ook al scheelt het in de praktijk nagenoeg niets. Ik ga nog even uitzoeken wat je bedoelt met grotere bestanden. Want het zou theoretisch voor alles moeten werken?

Verwijderd

Steven schreef op 03 January 2003 @ 21:15:
[...]


Oh tuurlijk, dat had ik zelf ook kunnen bedenken :) Ook al scheelt het in de praktijk nagenoeg niets.


Gehehe, moet jij maar eens opletten ;)

Maak maar eens een testdir aan waarin je wat grote bestanden (van zeg 1 MB) zet die bijvoorbeeld met de letter "z" beginnen en maak dan maar eens een lege subdir daarin aan die begint met de letter "a". Pas vervolgens de door mij gegeven code weer aan, zodat je een post-increment krijgt i.p.v. een pre-increment.

Wat is de uitkomst van de dirsize dan? 0 om precies te zijn ;) Niet helemaal hetgeen je wil hebben.

  • Wilke
  • Registratie: December 2000
  • Laatst online: 22:38
Voordat je verkeerde aannames gaat doen: de blocksize is niet altijd 4 KB, dat kun je namelijk zelf opgeven bij het formatteren van een ext2-partitie.

  • Steven
  • Registratie: December 2000
  • Laatst online: 08-05 23:25
Verwijderd schreef op 03 January 2003 @ 21:24:

[...]


Gehehe, moet jij maar eens opletten ;)

Maak maar eens een testdir aan waarin je wat grote bestanden (van zeg 1 MB) zet die bijvoorbeeld met de letter "z" beginnen en maak dan maar eens een lege subdir daarin aan die begint met de letter "a". Pas vervolgens de door mij gegeven code weer aan, zodat je een post-increment krijgt i.p.v. een pre-increment.

Wat is de uitkomst van de dirsize dan? 0 om precies te zijn ;) Niet helemaal hetgeen je wil hebben.
Oh ja tuurlijk, heeft denk ik te maken met mijn testcase ;)
Wilke schreef op 03 January 2003 @ 22:27:
Voordat je verkeerde aannames gaat doen: de blocksize is niet altijd 4 KB, dat kun je namelijk zelf opgeven bij het formatteren van een ext2-partitie.
Had ik door, maar toch bedankt :)


Niemand heeft een idee waarom de uitkomst toch blijft verschillen?

Verwijderd

Tip; doe maar eens per bestand echo'en wat de size is en vergelijk dat met du -a -b -c

  • Steven
  • Registratie: December 2000
  • Laatst online: 08-05 23:25
Was ik idd al mee bezig en ik heb de reden gevonden en dat heeft vooral te maken met de manier van een ext. file systeem.

Ik snap het niet helemaal, maar het komt er op neer dat als je onderstaande code gebruikt je al veel meer succes heeft. (vanaf het twaalfde blok moet er een Double inode oid gebruikt worden wat weer een extra block vergt). Maar er zit nog ergens zo'n grens (voor de Triple Inode), dus bij hele grote bestanden kom je nog een keer in de knoei.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
function dirsize($dir, $pos=0) {  
    global $totalDirSize;  
    if($pos == 0) { 
        $totalDirSize = 0; 
    } 
    $totalDirSize += 4096; 
     
    $handle = @opendir($dir);  
    while ($file = @readdir ($handle)){  
        if (eregi("^\.{1,2}$", $file)) { 
            continue;  
    } 
        if (is_dir($dir.$file)) {  
            dirsize("$dir$file/", ++$pos);  
        } else {  
            $size=filesize($dir.$file);
            if ($size > 12 * 4096) {
                $size += 4096;
            }
            $size = ceil($size / 4096) * 4096; 
            $totalDirSize += $size;  
        }  
    }  
    @closedir($handle);  
    return($totalDirSize);  
}

[ Voor 3% gewijzigd door Steven op 03-01-2003 23:40 ]

Pagina: 1