[Python] listdir

Manlio Perillo manlio.perillo a gmail.com
Mer 5 Ott 2011 22:03:39 CEST


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Il 21/07/2011 08:55, Filadelfo Fiamma ha scritto:
> Ciao ragazzi,
> avrei una curiosità:
>   esiste il modo di limitare il numero di elementi trovati da
> os.listdir? Se ho una cartella contenente 2 milioni d files, ho modo
> di vedere soltanto i primi 500, una sorta di TOP(500)?
> Ovviamente sto escludendo la soluzioni banale di eseguire os.listdir()[:500]!
> 

Rispondo a questo vecchio messaggio perchè oggi ho scoperto la syscall
del kernel di Linux per leggere direttamente il contenuto di una directory:

http://www.kernel.org/doc/man-pages/online/pages/man2/getdents.2.html
http://www.olark.com/spw/2011/08/you-can-list-a-directory-with-8-million-files-but-not-with-ls/


In Python non credo ci siano wrappers pronti (sembra non ci siano
nemmeno nella libc), ma è abbastanza facile con ctypes.

Per vedere soltanto i primi 500 files basta improvvisare un valore
opportuno per la dimensione del buffer, tenendo conto della lunghezza
media dei nomi di files.
La lunghezza di un record dovrebbe essere almeno 16 (per un d_name di
lunghezza 1).
Sul mio sistema la struttura linux_dirent sembra sia word aligned.

Probabilmente ne leggerai un pò di più meno o un pò di meno, nell'ultimo
caso basta un ulteriore syscal.



Ciao  Manlio
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.10 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iEYEARECAAYFAk6MuBsACgkQscQJ24LbaUQuSwCeOD/eJlsmdln77689w1vWDFut
xJMAn3mFftWY99HIzwZR/AxkHI23wYHD
=lwnC
-----END PGP SIGNATURE-----


Maggiori informazioni sulla lista Python