Re: [Python] listdir
-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- ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] listdir
2011/7/21 Filadelfo Fiamma philosga...@gmail.com 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]! Se non ricordo male, in questo caso dovresti usare le funzioni di livello piu' basso: opendir(), readdir() e closedir() ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] listdir
2011/7/21 Filadelfo Fiamma philosga...@gmail.com 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, Comunque se hai una cartella cosi', tutti i programmi che ne fanno uso avranno vantaggio dividendola in uno o due livelli di sottocartelle possibilmente di dimensione confrontabile. Cosi' fanno i programmi che devono gestire milioni di file di cache. Se i file non vengono rinominati, una buona idea potrebbe essere usare, come nome delle sottocartelle, la prima parte dell'md5 del nome dei file che andranno a contenere. ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] listdir
Grazie :) Si concordo appieno sul fatto che avere un unica enorme cartella non è vantaggioso, per fortuna non mi è capitato ancora di avere a che fare con delle directory così piene, ma era solo una mera discussione teorica! Comunque andrò a vedermi dettagliamente opendir(), readdir() e closedir(). Thks FF Il 21 luglio 2011 09:45, Marco Mariani bir...@gmail.com ha scritto: 2011/7/21 Filadelfo Fiamma philosga...@gmail.com 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, Comunque se hai una cartella cosi', tutti i programmi che ne fanno uso avranno vantaggio dividendola in uno o due livelli di sottocartelle possibilmente di dimensione confrontabile. Cosi' fanno i programmi che devono gestire milioni di file di cache. Se i file non vengono rinominati, una buona idea potrebbe essere usare, come nome delle sottocartelle, la prima parte dell'md5 del nome dei file che andranno a contenere. ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python -- Filadelfo Fiamma mail: philosga...@gmail.com ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] listdir
Puoi usare glob.iglob, che ritorna un iteratore e non una lista. # esempio1: for filename in os.listdir('.'): print filename # esempio2: for filename in glob.iglob('.'): print filename la differenza tra esempio1 e esempio2 è che nel primo viene generata tutta la lista dei file nella directory (occupando memoria), mentre in esempio2 viene preso un file alla volta (con una occupazione di memoria minima). 2011/7/21 Marco Mariani bir...@gmail.com: 2011/7/21 Filadelfo Fiamma philosga...@gmail.com 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, Comunque se hai una cartella cosi', tutti i programmi che ne fanno uso avranno vantaggio dividendola in uno o due livelli di sottocartelle possibilmente di dimensione confrontabile. Cosi' fanno i programmi che devono gestire milioni di file di cache. Se i file non vengono rinominati, una buona idea potrebbe essere usare, come nome delle sottocartelle, la prima parte dell'md5 del nome dei file che andranno a contenere. ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python -- Giovanni Dall'Olio, phd student Department of Biologia Evolutiva at CEXS-UPF (Barcelona, Spain) My blog on bioinformatics: http://bioinfoblog.it ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] listdir
2011/7/21 Giovanni Marco Dall'Olio dalloli...@gmail.com la differenza tra esempio1 e esempio2 è che nel primo viene generata tutta la lista dei file nella directory (occupando memoria), mentre in esempio2 viene preso un file alla volta (con una occupazione di memoria minima). Cosa succede dipende poi anche dal file system, se deve accedere a 2 milioni di inode solo per avere il nome dei file, che tipo di alberi o liste utilizza, etc... Io farei di tutto per evitare questa situazione. A oltre 1 milione di file ci sono arrivato e li ho divisi in 1000x1000 ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] listdir
Giovanni Marco Dall'Olio wrote: Puoi usare glob.iglob, che ritorna un iteratore e non una lista. # esempio1: for filename in os.listdir('.'): print filename # esempio2: for filename in glob.iglob('.'): print filename Bella idea! Credo che per avere un comportamento più simile a esempio1 però dovrebbe essere glob.iglob('*'). Altro problema potrebbe essere nel caso ci siano file nascosti di tipo .nomefile che glob ignora. Lorenzo. la differenza tra esempio1 e esempio2 è che nel primo viene generata tutta la lista dei file nella directory (occupando memoria), mentre in esempio2 viene preso un file alla volta (con una occupazione di memoria minima). 2011/7/21 Marco Mariani bir...@gmail.com: 2011/7/21 Filadelfo Fiamma philosga...@gmail.com 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, Comunque se hai una cartella cosi', tutti i programmi che ne fanno uso avranno vantaggio dividendola in uno o due livelli di sottocartelle possibilmente di dimensione confrontabile. Cosi' fanno i programmi che devono gestire milioni di file di cache. Se i file non vengono rinominati, una buona idea potrebbe essere usare, come nome delle sottocartelle, la prima parte dell'md5 del nome dei file che andranno a contenere. ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] listdir
Il giorno 21 luglio 2011 09:54, Giovanni Marco Dall'Olio dalloli...@gmail.com ha scritto: Puoi usare glob.iglob, che ritorna un iteratore e non una lista. # esempio1: for filename in os.listdir('.'): print filename # esempio2: for filename in glob.iglob('.'): print filename la differenza tra esempio1 e esempio2 è che nel primo viene generata tutta la lista dei file nella directory (occupando memoria), mentre in esempio2 viene preso un file alla volta (con una occupazione di memoria minima). Non ci dovrebbe essere nessuna differenza dato che internamente glob.iglob non fa altro che chiamare os.listdir(). http://hg.python.org/cpython/file/default/Lib/glob.py --- Giampaolo http://code.google.com/p/pyftpdlib/ http://code.google.com/p/psutil/ http://code.google.com/p/pyftpdlib/ ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python
Re: [Python] listdir
-BEGIN PGP SIGNED MESSAGE- Hash: SHA1 Il 21/07/2011 09:54, Giovanni Marco Dall'Olio ha scritto: Puoi usare glob.iglob, che ritorna un iteratore e non una lista. Attenzione che iglob è implementato usando os.listdir! L'unica soluzione per avere una lista di directory lazy è usare opendir(), readdir() e closedir(). Pensandoci, strano che la libreria standard non offra niente; listdir per sistemi Posix è implementata usando opendir(), readdir() e closedir(), ma restituisce una lista non un generatore. [...] Ciao Manlio -BEGIN PGP SIGNATURE- Version: GnuPG v1.4.10 (GNU/Linux) Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/ iEYEARECAAYFAk4oGf4ACgkQscQJ24LbaUR/LQCdGj+Unw0boOX60pioSZIdlvgi ++0An0hlFv6erdn9snHMzylPx9dZf291 =Rcgt -END PGP SIGNATURE- ___ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python