60 000 je nic, 20 000 také. Ale měli byste seskupit těchto 20 000 jakýmkoli způsobem, abyste urychlili přístup k nim. Možná ve skupinách po 100 nebo 1000 tak, že vezmete číslo adresáře a vydělíte ho 100, 500, 1000, čímkoli.
Mám například projekt, kde soubory mají čísla. Seskupuji je do 1000, takže mám
id/1/1332
id/3/3256
id/12/12334
id/350/350934
Ve skutečnosti můžete mít pevný limit – některé systémy mají 32bitové inody, takže jste omezeni na počet 2^32 na souborový systém.
Pokud má souborový systém vašeho serveru dir_index
funkce zapnuta (viz tune2fs(8)
podrobnosti o kontrole a zapnutí funkce), pak můžete rozumně uložit až 100 000 souborů do adresáře, než dojde ke snížení výkonu. (dir_index
je výchozí pro nové souborové systémy pro většinu distribucí již několik let, takže by byl pouze starý souborový systém, který tuto funkci ve výchozím nastavení nemá.)
To znamená, že přidání další úrovně adresáře ke snížení počtu souborů v adresáři faktorem 16 nebo 256 by výrazně zvýšilo šance na věci jako ls *
funguje bez překročení maxima jádra argv
velikost.
Typicky se to provádí něčím jako:
/a/a1111
/a/a1112
...
/b/b1111
...
/c/c6565
...
tj. přidáním písmene nebo číslice před cestu, na základě nějaké funkce, kterou můžete vypočítat z názvu. (První dva znaky z md5sum
nebo sha1sum
z názvu souboru je jeden běžný přístup, ale pokud máte jedinečné ID objektů, pak 'a'+ id % 16
je dostatečně snadný mechanismus pro určení, který adresář použít.)
souborové systémy ext[234] mají pevný maximální počet inodů; každý soubor nebo adresář vyžaduje jeden inode. Aktuální počet a limity můžete zobrazit pomocí df -i
. Například na 15GB souborovém systému ext3, vytvořeném s výchozím nastavením:
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/xvda 1933312 134815 1798497 7% /
Kromě toho neexistuje žádný limit na adresáře; mějte na paměti, že každý soubor nebo adresář vyžaduje alespoň jeden blok souborového systému (obvykle 4 kB), i když se jedná o adresář s pouze jednou položkou.
Jak však vidíte, 80 000 inodů pravděpodobně nebude problém. A s dir_index
možnost (povolit pomocí tune2fs
), vyhledávání ve velkých adresářích není příliš velký problém. Mějte však na paměti, že mnoho nástrojů pro správu (například ls
nebo rm
) může mít problém se vypořádat s adresáři, které obsahují příliš mnoho souborů. Proto se doporučuje rozdělit soubory tak, abyste v žádném adresáři neměli více než několik set až tisíc položek. Snadný způsob, jak toho dosáhnout, je hašovat jakékoli ID, které používáte, a použít prvních několik hexadecimálních číslic jako přechodné adresáře.
Řekněme například, že máte položku s ID 12345 a zahašuje se na 'DEADBEEF02842.......'
. Soubory můžete ukládat pod /storage/root/d/e/12345
. Nyní jste snížili počet souborů v každém adresáři o 1/256.