Question

J'essaie de décompresser environ 8 000 fichiers au format gzip en Java. Mon premier essai a été d’utiliser GZIPInputStream mais les performances étaient affreuses.

Quelqu'un connaît-il une alternative pour décompresser les archives gzip? J'ai essayé ZipInputStream mais il ne reconnaît pas le format gzip.

Merci d'avance.

Était-ce utile?

La solution

Vous devez utiliser la mise en mémoire tampon. Écrire de petites données va être inefficace. L'implémentation de la compression est en code natif dans le JDK de Sun. Même si ce n’était pas le cas, les performances en mémoire tampon devraient dépasser les E / S réseau ou réseau raisonnables.

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

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

Le code natif étant utilisé pour implémenter l'algorithme de décompression / compression, veillez à fermer le flux (et pas uniquement le flux sous-jacent) après utilisation. J'ai constaté que des tonnes de `Deflaters 'traînaient sont très mauvais pour la performance.

ZipInputStream traite les archives de fichiers, ce qui est complètement différent de la compression d'un flux.

Autres conseils

Quand vous dites que les performances de GZipInputStream sont abominables, pourriez-vous être plus précis? Avez-vous découvert s'il s'agissait d'un goulot d'étranglement de processeur ou d'E / S? Utilisiez-vous la mise en mémoire tampon à la fois en entrée et en sortie? Si vous pouviez publier le code que vous utilisiez, ce serait très utile.

Si vous utilisez une machine multi-core, vous pouvez toujours utiliser GZipInputStream mais en utilisant plusieurs threads, un par core, avec une file d'attente partagée à traiter. (Chaque fichier ne serait traité que par un seul thread.) Cela pourrait aggraver les choses si vous êtes lié à l'entrée-sortie, mais cela peut valoir la peine d'essayer.

Pour ce type d’échelle, vous voudrez peut-être devenir natif, en supposant que les exigences de votre plate-forme soient limitées. Vous pouvez utiliser JNI pour appeler une bibliothèque ou appeler une commande native à l'aide de ProcessBuilder .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top