Domanda

Sto cercando di decomprimere circa 8000 file in formato gzip in Java. Il mio primo tentativo è stato quello di utilizzare GZIPInputStream ma le prestazioni sono state orribili.

Qualcuno conosce qualche alternativa per decomprimere gli archivi gzip? Ho provato ZipInputStream ma non riconosce il formato gzip.

Grazie in anticipo.

È stato utile?

Soluzione

Devi usare il buffering. Scrivere piccoli pezzi di dati sarà inefficiente. L'implementazione della compressione è in codice nativo in Sun JDK. Anche se non fosse la prestazione con buffer, di solito dovrebbe superare un ragionevole I / O di file o di rete.

OutputStream out = new BufferedOutputStream(new GZIPOutputStream(rawOut));

InputStream in = new BufferedInputStream(new GZIPInputStream(rawIn));

Poiché il codice nativo viene utilizzato per implementare l'algoritmo di decompressione / compressione, prestare molta attenzione a chiudere il flusso (e non solo il flusso sottostante) dopo l'uso. Ho scoperto che avere un sacco di "Deflaters" in giro è molto cattivo per le prestazioni.

ZipInputStream si occupa di archivi di file, il che è una cosa completamente diversa dalla compressione di un flusso.

Altri suggerimenti

Quando dici che le prestazioni di GZipInputStream sono state orribili, potresti essere più specifico? Hai scoperto se si trattava di un collo di bottiglia della CPU o di un collo di bottiglia I / O? Stavi usando il buffering sia in input che in output? Se potessi pubblicare il codice che stavi utilizzando, sarebbe molto utile.

Se utilizzi un computer multi-core, puoi comunque provare a utilizzare GZipInputStream ma utilizzando più thread, uno per core, con una coda condivisa di file ancora in elaborazione. (Ogni singolo file verrebbe elaborato solo da un singolo thread.) Che potrebbe peggiorare le cose se sei legato all'I / O, ma potrebbe valere la pena provarlo.

Per quel tipo di scala, potresti voler diventare nativo, supponendo che i requisiti della tua piattaforma siano limitati. Puoi usare JNI per chiamare una libreria o invocare un comando nativo usando ProcessBuilder .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top