Pregunta

Estoy tratando de descomprimir unos 8000 archivos en formato gzip en Java. Mi primer intento fue usar GZIPInputStream pero el rendimiento fue horrible.

¿Alguien sabe alguna alternativa para descomprimir archivos gzip? Intenté ZipInputStream pero no reconoce el formato gzip.

Gracias de antemano.

¿Fue útil?

Solución

Debe usar el almacenamiento en búfer. Escribir pequeños datos será ineficiente. La implementación de compresión está en código nativo en Sun JDK. Incluso si no fuera el rendimiento amortiguado, generalmente debería exceder las E / S de red o archivos razonables.

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

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

Como el código nativo se usa para implementar el algoritmo de descompresión / compresión, tenga mucho cuidado de cerrar la secuencia (y no solo la secuencia subyacente) después del uso. Descubrí que tener un montón de `Deflaters 'dando vueltas es muy malo para el rendimiento.

ZipInputStream trata con archivos de archivos, lo cual es algo completamente diferente de comprimir una secuencia.

Otros consejos

Cuando dice que el rendimiento de GZipInputStream fue horrible, ¿podría ser más específico? ¿Descubrió si era un cuello de botella de CPU o un cuello de botella de E / S? ¿Estaba utilizando el almacenamiento en búfer tanto en la entrada como en la salida? Si pudiera publicar el código que estaba usando, sería muy útil.

Si está en una máquina de varios núcleos, puede intentar seguir usando GZipInputStream pero usando múltiples subprocesos, uno por núcleo, con una cola compartida de archivos aún por procesar. (Cualquier archivo solo sería procesado por un solo hilo). Eso podría empeorar las cosas si está vinculado a E / S, pero puede valer la pena intentarlo.

Para ese tipo de escala, es posible que desee volverse nativo, suponiendo que los requisitos de su plataforma sean limitados. Puede usar JNI para llamar a una biblioteca o invocar un comando nativo usando ProcessBuilder .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top