2013-08-07 17 views
10

E 'possibile aggiungere un file di testo gzip al volo usando Python?Python Gzip - Aggiungere file al volo

Fondamentalmente sto facendo questo: -

import gzip 
content = "Lots of content here" 
f = gzip.open('file.txt.gz', 'a', 9) 
f.write(content) 
f.close() 

Una linea viene aggiunto (nota "aggiunto") per il file ogni 6 secondi o giù di lì, ma il file risultante è altrettanto grande come un file non compresso standard di (circa 1 MB al termine).

Specificare esplicitamente il livello di compressione non sembra fare la differenza.

Se gzip un file esistente non compresso in seguito, la sua dimensione scende a circa 80kb.

Suppongo che non sia possibile "aggiungere" a un file gzip al volo e comprimerlo?

Si tratta di un caso di scrittura su un buffer String.IO e quindi di eseguire il flushing su un file gzip una volta terminato?

+4

Perché l'algoritmo gzip funzioni in modo efficiente, deve mettere le mani sull'intero contenuto da comprimere. Altrimenti, stai semplicemente aggiungendo blocchi di contenuto gzip che non hanno nulla a che fare l'uno con l'altro. – Nadh

+0

@Nadh quindi immagino che la mia ultima riga sia corretta? Scrivi su String.IO e scarica su gzip? –

+1

Sì, dovrebbe funzionare. Devi solo assicurarti che tutto il contenuto sia gzip in qualsiasi istante. – Nadh

risposta

9

Che funziona nel senso di creare e mantenere un file gzip valido, poiché il formato gzip consente i flussi gzip concatenati.

Tuttavia non funziona nel senso che si ottiene una compressione scadente, dal momento che si sta dando ad ogni istanza della compressione gzip così pochi dati con cui lavorare. La compressione dipende dal trarre vantaggio dalla cronologia dei dati precedenti, ma qui gzip non è stato dato sostanzialmente a nessuno.

Puoi a) accumulare almeno alcuni K di dati, molte delle tue linee, prima di invocare gzip per aggiungere un altro flusso gzip al file, oppure b) fare qualcosa di molto più sofisticato che si aggiunge a un singolo flusso gzip , lasciando ogni volta un flusso gzip valido e consentendo una compressione efficiente dei dati.

È possibile trovare un esempio di b) in C, in gzlog.h e gzlog.c. Non credo che Python abbia tutte le interfacce di zlib necessarie per implementare gzlog direttamente in Python, ma potresti interfacciarti al codice C di Python.