Вопрос

Я пытаюсь распаковать около 8000 файлов в формате gzip на Java. Моей первой попыткой было использовать GZIPInputStream, но производительность была ужасной.

Кто-нибудь знает альтернативу распаковке архивов gzip? Я попробовал ZipInputStream, но он не распознает формат gzip.

Заранее спасибо.

Это было полезно?

Решение

Вам нужно использовать буферизацию. Запись небольших фрагментов данных будет неэффективной. Реализация сжатия в собственном коде в Sun JDK. Даже если это не буферная производительность, она обычно должна превышать разумный файловый или сетевой ввод / вывод.

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

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

Поскольку нативный код используется для реализации алгоритма распаковки / сжатия, будьте очень осторожны, чтобы закрыть поток (а не только основной поток) после использования. Я обнаружил, что куча «Дефлатеров» висит очень на производительности.

ZipInputStream работает с архивами файлов, что совершенно отличается от сжатия потока.

Другие советы

Когда вы говорите, что производительность GZipInputStream была ужасной, не могли бы вы быть более точным? Вы узнали, было ли это узким местом ЦП или узким местом ввода / вывода? Вы использовали буферизацию как на входе, так и на выходе? Если бы вы могли опубликовать код, который вы использовали, это было бы очень полезно.

Если вы работаете на многоядерном компьютере, вы можете попробовать использовать GZipInputStream , но использовать несколько потоков, по одному на ядро, с общей очередью файлов, которые еще предстоит обработать. (Любой один файл будет обрабатываться только одним потоком.) Это может ухудшить ситуацию, если вы ограничены вводом / выводом, но, возможно, стоит попробовать.

Для такого масштаба вы, возможно, захотите использовать нативную версию, предполагая, что требования к вашей платформе ограничены. Вы можете использовать JNI для вызова библиотеки или вызова собственной команды, используя ProcessBuilder .

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top