2012-08-29 10 views
7

¿Es posible obtener una lista parcial de directorios?lista parcial de directorios

En Python, tengo un proceso que intenta obtener os.listdir de un directorio que contiene> 100.000 de archivos y lleva una eternidad. Me gustaría poder, digamos, obtener una lista de los primeros 1,000 archivos rápidamente.

¿Cómo puedo lograrlo?

+4

Esto podría ser útil: http://www.olark.com/spw/2011/08/you-can-list-a-directory-with-8-million-files-but-not-with-ls/ – Kev

+0

¡Aseado! No lo sabía. –

+1

¿Es importante el orden? –

Respuesta

3

he encontrado una solución que me da un orden aleatorio de los archivos :) (al menos yo no puedo ver un patrón)

En primer lugar he encontrado this post in the python maillist. Hay 3 archivos adjuntos que debe copiar en su disco (opendir.pyx, setup.py, test.py). A continuación, necesita el paquete python Pyrex para compilar el archivo opendir.pyx desde la publicación. Tuve problemas para instalar Pyrex y descubrí que tenía que instalar python-dev a través de apt-get. Luego instalé el paquete opendir de los tres archivos descargados anteriormente con python setup.py install. El archivo test.py contiene ejemplos de cómo usarlo.

Siguiente Me interesaba saber cuánto más rápida sería esta solución que usar os.listdir y crear 200000 archivos con el siguiente shellscript pequeño.

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

El siguiente script es mi punto de referencia que se ejecuta en el directorio en el que acabo de crear los archivos:

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) 

La salida en mi sistema es:

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] 

Como se puede ver que obtuve una aceleración de un factor de 200 al devolver una lista con 100 nombres de archivos de los 200000, eso es bastante agradable :).

Espero que este sea el objetivo que está tratando de lograr.

+0

+1: interesante, pero prefiero tener una solución más estándar. – jldupont

Cuestiones relacionadas