Распакуйте архив Gzip на Java - PullRequest
5 голосов
/ 10 марта 2009

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

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

Спасибо заранее.

Ответы [ 3 ]

8 голосов
/ 10 марта 2009

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

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

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

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

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

4 голосов
/ 10 марта 2009

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

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

0 голосов
/ 10 марта 2009

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

...