2012-08-29 12 views
7

È possibile ottenere un elenco di directory parziale?elenco di directory parziale

In Python, ho un processo che tenta di ottenere os.listdir di una directory contenente> 100.000 di file e richiede sempre. Mi piacerebbe essere in grado, diciamo, di ottenere rapidamente un elenco dei primi 1.000 file.

Come posso ottenere questo risultato?

+4

Questo potrebbe essere utile: http://www.olark.com/spw/2011/08/you-can-list-a-directory-with-8-million-files-but-not-with-ls/ – Kev

+0

Neat! Non lo sapevo. –

+1

L'ordine è importante? –

risposta

3

ho trovato una soluzione che mi dà un ordine casuale dei file :) (almeno io non riesco a vedere un modello)

Per prima cosa ho trovato this post in the python maillist. Ci sono 3 file allegati che devi copiare sul tuo disco (opendir.pyx, setup.py, test.py). Successivamente è necessario il pacchetto python Pyrex per compilare il file opendir.pyx dal post. Ho avuto problemi nell'installare Pyrex e ho scoperto che dovevo installare python-dev tramite apt-get. Successivamente ho installato il pacchetto opendir dai tre file sopra scaricati con python setup.py install. Il file test.py contiene esempi su come usarlo.

Avanti Ero interessato a quanto sarebbe stata più veloce questa soluzione rispetto all'utilizzo di os.listdir e ho creato 200000 file con il seguente piccolo shellscript.

for((i=0; i<200000; i++)) 
do 
    touch $i 
done 

Lo script che segue è il mio punto di riferimento in esecuzione nella directory in cui ho appena creato il file:

from opendir import opendir 
from timeit import Timer 
import os 

def list_first_fast(i): 
    d=opendir(".") 
    filenames=[] 
    for _ in range(i): 
     name = d.read() 
     if not name: 
      break 
     filenames.append(name) 
    return filenames 

def list_first_slow(i): 
    return os.listdir(".")[:i] 

if __name__ == '__main__': 
    t1 = Timer("list_first_fast(100)", "from __main__ import list_first_fast") 
    t2 = Timer("list_first_slow(100)", "from __main__ import list_first_slow") 
    print "With opendir: ", t1.repeat(5, 100) 
    print "With os.list: ", t2.repeat(5, 100) 

L'uscita sul mio sistema è:

With opendir: [0.045053958892822266, 0.04376697540283203, 0.0437769889831543, 0.04387712478637695, 0.04404592514038086] 
With os.list: [9.50291895866394, 9.567682027816772, 9.865844964981079, 13.486984968185425, 9.51977801322937] 

Come potete vedere ho ha ottenuto un aumento di 200 volte quando si restituisce una lista con 100 nomi di file su 200000, il che è molto carino :).

Spero che questo sia l'obiettivo che stai cercando di raggiungere.

+0

+1: interessante ma preferirei avere una soluzione più standard. – jldupont

Problemi correlati