Avui estava arreglant part d'un codi on es descarregava un fitxer gzip de la web i l'havia d'insertar el contingut a una taula d'una base de dades.

Anteriorment el codi feia:
  1. Baixar-se l'stream en gzip.
  2. Guardar-lo a un fitxer .gz al sistema de fitxers.
  3. Obrir el fitxer .gz guardat per descomprimir-lo.
  4. Guardar el fitxer descomprimint al sistema de fitxers.
  5. Obrir el fitxer descomprimit per llegir-lo
  6. Guardar-lo a la base de dades
De la llista anterior es pot deduir que hi ha massa descriptors de fitxers, i que l'accés al sistema de fitxers pot ser costosa. Per tant la idea era millorar aquest codi i fer que tant com es pogués es fes en memòria.

Buscant a la documentació del mòdul gzip de python només trobava que el paràmetre que se li podia passar era la ruta d'un fitxer i aquest després l'obria i duia  a terme totes les operacions. Finalment buscant pel sant google, he trobat una resposta a la magnífica pàgina de stackoverflow.

Actualment el codi fa:
  1. Baixar-se l'stream en gzip.
  2. Descomprimir l'stream gzip en memòria i posant-lo a un altre stream
  3. Obrir l'stream descomprimit.
  4. Guardar-lo a la base de dades
Exemple del codi en python
 
[...]
r = conn.getresponse()
c = StringIO.StringIO(r.read())
m = StringIO.StringIO(gzip.GzipFile(fileobj=c).read())
c.close()
     
# Importem el fitxer
import csv
reader = csv.reader(m, delimiter=';')

[...]
m.close()
1

Mostra els comentaris

  1. Des de que vaig descobrir StringIO sóc un home nou... jajaja

    Va de perles :)

    ResponElimina
Arxiu del blog
Etiquetes
Altres coses meves
Blogroll
Blogroll
Blogs que llegeixo
Blogs que llegeixo
Subscriu-me
Subscriu-me
Logotip
Logotip
Total de visualitzacions de pàgina:
Total de visualitzacions de pàgina:
29397
S’està carregant