Op dinsdag 09 juli 2002 21:28 schreef Gerco het volgende:
Aangezien hij al gepost had dat 400.000 files op 1 schijf niet goed liep, zou het beter lopen als je die files verdeelt over meerdere schijven (of partities dus).
Blijkbaar gebruikt hij een filesystem wat daar wel gevoelig voor is, dus je opmerking raakt kant noch wal

(al heb je natuurlijk wel gelijk, maar dat is nu niet van toepassing).
Ik heb wat lopen spelen met deze scriptjes:
files.php:
PHP:
1
| <? function getmicrotime() { list($usec, $sec) = explode(" ",microtime()); return ((float)$usec + (float)$sec); } `mkdir -p filetest`; for($i = 0; $i < 1000; $i++) { `mkdir -p filetest/$i`; echo "Doing files $i "; flush(); $start = getmicrotime(); for($j = 0; $j < 1000; $j++) { touch("filetest/$i/$j"); } $end = getmicrotime(); echo "Took: " . number_format(($end - $start), 3) . " s \n"; }?> |
open.php:
PHP:
1
| <? function getmicrotime() { list($usec, $sec) = explode(" ",microtime()); return ((float)$usec + (float)$sec); } for($i = 0; $i < 100; $i++) { echo "Selecting files $i "; flush(); $start = getmicrotime(); for($j = 0; $j < 100; $j++) { $x = rand(0, 9); $y = rand(0, 999); file("filetest/$x/$y"); } $end = getmicrotime(); echo "Took: " . number_format(($end - $start), 3) . " s \n"; }?> |
De code is dusdanig simpel dat hetzelfde in C vast sneller, maar niet 'beter' testen is
Bevindingen:
Per file kost het net zoveel tijd om de eerste 1000 te maken als de laatste 1000 (de 999000 tm 999999 dus)
Een miljoen files leverde me geen crash op, zelfs nu heb ik nog één miljoen inodes vrij.
Ik weet dat de files leeg waren, ik had er ook random data in kunnen schrijven, maar dan had mijn schijf het kwa ruimte niet leuk gevonden

Als ik uit _alle_ files random selecteerde kostte het uiteraard meer tijd dan uit slechts de eerste 10.000, dit omdat de boel dan niet zo netjes in de filecaches zat.
Het kostte echter NIET meer tijd om de eerste 10.000 files te random-accessen met 10.000 of 1.000.000 files in totaal.
Owja, doe dit niet met een creatie-regel ala `touch filenaam`

dan duurt het ipv 0.15 seconde per 1000 files ineens 5 seconde per 1000 files (leuk dat forken

).
Gebruikte software en hardware:
Gentoo linux met een 2.4.19-optimised kernel en alle libs i686 optimised.
php-4.2.1 optimised voor i686 in de commandline (bash 2.0.5a) op een athlon 850 + 512MB ddr-ecc-sdram + 20GB 7200rpm wd-ide-schrijf.
Ik zal het eens testen met files van 4KB oid als iemand daar interesse in heeft, maar ik verwacht geen spectaculaire verschillen (ja het zal slomer zijn

).
Een zelfde vergelijking op mysql uithalen zal interessanter zijn (maar dan moet de file wel data bevatten

)
Owja, de conclusie:
Een goed fs op een goed os kan makkelijk meer dan 400.000 files aan, als je het maar netjes in dirs organiseert.
Als het goed dat voor zowel linux, freebsd, etc, etc als ook windows 2000/XP met ntfs