2011-05-05 12 views
5

Estoy leyendo algunos datos del archivo avro usando la biblioteca avro. Lleva aproximadamente un minuto cargar 33K objetos del archivo. Esto me parece muy lento, especialmente con la versión de Java leyendo el mismo archivo en aproximadamente 1 segundo.implementación Python de avro lento?

Aquí está el código, ¿estoy haciendo algo mal?

import avro.datafile 
import avro.io 
from time import time 

def load(filename): 
    fo = open(filename, "rb") 
    reader = avro.datafile.DataFileReader(fo, avro.io.DatumReader()) 
    for i, record in enumerate(reader): 
     pass 

    return i + 1 

def main(argv=None): 
    import sys 
    from argparse import ArgumentParser 

    argv = argv or sys.argv 

    parser = ArgumentParser(description="Read avro file") 


    start = time() 
    num_records = load("events.avro") 
    end = time() 

    print("{0} records in {1} seconds".format(num_records, end - start)) 

if __name__ == "__main__": 
    main() 
+0

Tu código no hace nada. Si hay un problema de velocidad es con Avro. –

+0

'load()' debe llamar a 'fo.close()' antes de que regrese, en lugar de dejar el archivo abierto. Sin embargo, probablemente no sea motivo de desaceleración. – Velociraptors

+0

si quieres saber por qué es lento, aprende a usar un generador de perfiles. –

Respuesta

3

El avro Python package disponibles en PyPI es Python puro, por lo que no me sorprende si es más lento que Java en un orden de magniture o más.

Hay una implementación de Avro C, pero que yo sepa, nadie ha creado aún una extensión de Python basada en ella.

+0

Lamentablemente, la implementación de Avro C segfaults en mi archivo. – lazy1

+0

@ lazy1 bummer. ¿Estás obligado a usar el formato Avro y has considerado alternativas? – samplebias

+0

La alternativa es CSV, que en Python es muy rápido (0.2 para 33K líneas). Sin embargo, el CSV no tiene el esquema como avro lo hace. Yo * podría * ser capaz de usar encabezados CSV, pero como alguien más los está produciendo (a través de Pig), no estoy 100% seguro de que sea posible. – lazy1

1

Parece que hay un paquete de Python llamado fastavro que es una implementación rápida de Cython, pero tiene menos funciones completas.

https://bitbucket.org/tebeka/fastavro

+7

Lo sé, lo escribí :) – lazy1

+0

lol ... oops ... :) –

Cuestiones relacionadas