Portál AbcLinuxu, 16. července 2025 11:41


Dotaz: Ako rýchlo čítať adresár?

8.9.2010 22:07 rastos | skóre: 63 | blog: rastos
Ako rýchlo čítať adresár?
Přečteno: 242×
Odpovědět | Admin
Potrebujem zistiť zoznam všetkých súborov v danom adresári, ich timestamp a veľkosť. Existuje rýchlejšia cesta ako opendir(), readdir(), stat(), closedir() ?
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

8.9.2010 23:53 Semo | skóre: 45 | blog: Semo
Rozbalit Rozbalit vše Re: Ako rýchlo čítať adresár?
Odpovědět | | Sbalit | Link | Blokovat | Admin
Tu sa popisuje inteligentnejsi readdir().
Některé souborové systémy dokáží vrátit typ souboru se jménem ve volání readdir(), takže v mnoha situacích není nutné volat stat()
Ale ci sa z toho da ziskat aj velkost a pod. to netusim.
If you hold a Unix shell up to your ear, you can you hear the C.
Heron avatar 9.9.2010 10:56 Heron | skóre: 53 | blog: root_at_heron | Olomouc
Rozbalit Rozbalit vše Re: Ako rýchlo čítať adresár?
Odpovědět | | Sbalit | Link | Blokovat | Admin
V podstatě neexistuje. Položka v adresářové struktuře jen ukazuje na inode a všechna metadata jsou až tam. Takže FS stejně musí sáhnout jak do adresářového stromu, tak do inode.

Pomohl by index, který by sis ale musel udržovat sám. Pokud jsou ty soubory pouze pro čtení, tak by jeho udržování nebylo náročné.

Případně, pokud je těch souborů opravdu hodně, tak zvážit jejich umístění do DB jako BYTEA, případně LONGBLOB. Metadata by byla přímo v tabulce, tedy rychle dostupná (a ještě k tomu snadno prohledávatelná, na rozdíl od FS) a data má DB interně uložena jinde (TOAST) a v tabulce je pouze pointer (pro uživatele je to transparentní a ten vidí data jakoby byla přímo v tabulce). IMHO je to nejlepší řešení pro mnoho souborů (nad několik set tisíc). Důrazně nedoporučuji soubory na disku a v DB jen cestu, to se rozsype po prvním ROLLBACK, případně ještě dřív.

Co by mělo pomoci okamžitě je přidání paměti. Každý pořádný FS si drží adresářovou strukturu a metadata v paměti. Takže po prvním přečtení z disku už se na něj prakticky pro tyto údaje nesáhne (pokud tedy je připojen s volbou noatime).
Heron
9.9.2010 12:37 rastos | skóre: 63 | blog: rastos
Rozbalit Rozbalit vše Re: Ako rýchlo čítať adresár?
Takže FS stejně musí sáhnout jak do adresářového stromu, tak do inode.
To je jasné. Skôr mi ide o to, či nie je možné napr. prečítať pole direntry štruktúr jedným volaním, alebo z čítania adresára dostávať handle a na tie potom volať fstat() miesto stat() čo by snáď mohlo byť o chlp rýchlejšie.

Celé ma to zaujíma kvôli tomu, že zisťovanie napr. time stampu a veľkosti súboru z Javy, sú viaceré volania na stat(). Chcem si napísať niečo efektívnejšie cez JNI.
Případně, pokud je těch souborů opravdu hodně, tak zvážit jejich umístění do DB
Ide o implementáciu backendu, ktorý má stanovený interface a za ním môžem mať napr. SQL databázu, ale v istých situáciách (počas vývoja, testovania, troubleshootingu, ...) je vhodné mať aj súborovú implementáciu. Zvláštne je, že napr. windowsové FindFirstFile() vracia WIN32_FIND_DATA kde už okrem nájdeného mena súboru je aj čas, veľkosť, atribúty ...

Vďaka za odozvu.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.