Re: [Python] listdir

2011-10-05 Per discussione Manlio Perillo
-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-07-21 Per discussione Marco Mariani
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-07-21 Per discussione Marco Mariani
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

2011-07-21 Per discussione Filadelfo Fiamma
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

2011-07-21 Per discussione Giovanni Marco Dall'Olio
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-07-21 Per discussione Marco Mariani
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

2011-07-21 Per discussione Lorenzo Sutton
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

2011-07-21 Per discussione Giampaolo Rodolà
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

2011-07-21 Per discussione Manlio Perillo
-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