Pergunta

Eu estou tentando descomprimir cerca de 8000 arquivos em formato gzip em Java. Minha primeira tentativa foi usar GZIPInputStream mas o desempenho foi horrível.

Alguém sabe alguma alternativa aos arquivos gzip descomprimir? Tentei ZipInputStream mas não está reconhecendo o formato gzip.

Agradecemos antecipadamente.

Foi útil?

Solução

Você precisa usar buffering. Escrever pequenos pedaços de dados vai ser ineficiente. A implementação de compressão é em código nativo no Sun JDK. Mesmo se não fosse o desempenho tamponada geralmente deve exceder razoável arquivo ou rede de I / O.

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

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

Como o código nativo é usado para implementar o algoritmo de descompressão / compressão, ter muito cuidado para fechar o fluxo (e não apenas o fluxo subjacente) após o uso. Já encontramos ter um monte de `Deflaters' pendurados ao redor é muito ruim para o desempenho.

ZipInputStream lida com arquivos de arquivos, o que é uma coisa completamente diferente de compressão de um córrego.

Outras dicas

Quando você diz que o desempenho de GZipInputStream foi horrível, poderia ser mais específico? Será que quis saber se era um afunilamento de CPU ou um / gargalo I O? você estava usando o buffer de entrada e saída? Se você poderia postar o código que você estava usando, que seria muito útil.

Se você estiver em uma máquina multi-core, você pode tentar ainda usando GZipInputStream mas usando vários segmentos, um por núcleo, com uma fila compartilhada de arquivos ainda ao processo. (Qualquer um arquivo só seria processado por um único segmento.) Isso pode tornar as coisas piores, se você é I / O ligado, mas pode valer a pena uma tentativa.

Para esse tipo de escala, você pode querer ir nativa, assumindo seus requisitos de plataforma são limitadas. Você pode usar JNI para chamar uma biblioteca ou invocar um comando nativo usando ProcessBuilder.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top