Самое быстрое сжатие для сериализуемых файлов в Java - PullRequest
1 голос
/ 20 марта 2011

У меня есть куча файлов (около 4000), каждый весом более 1-5 КБ, все они созданы с использованием механизма сериализации Java.

Я бы хотел сжать их и отправить черезсеть в виде одного файла.(Их объем составляет около 200-300 МБ.)

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

В настоящее время используется пакет zip, поставляемый с Apache Ant.Я прочитал, что в zip-файлах хранятся метаданные для каждого файла, поэтому я думаю, что zip-файлы здесь не лучший выбор.

Так что же предпочтительнее?Gzip / Tar?Или вообще не сжимать?Какую библиотеку Java вы бы порекомендовали для этого случая?

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

Ответы [ 3 ]

3 голосов
/ 20 марта 2011

Сжатие вообще не будет быстрым, но размер файла будет отрицательным.

Одна из причин, по которым tar.gz создает файлы меньшего размера, чем один zip, заключается в том, что gzip работает с большим буфером данных (всем файлом tar), в то время как в вашем случае zip работает только с данными одного файл за раз (обычно намного меньше, чем размер файла tar, если файлов много).

Таким образом, gzip получает возможность сжимать целую книгу с главами страниц за раз, тогда как zip сжимает каждую главу книги, а затем упаковывает сжатые главы в книгу - т.е. сжатая коллекция объектов обычно меньше, чем коллекция сжатые объекты.

Для получения результата, аналогичного tar.gz, вы можете заархивировать файлы на первом проходе, используя алгоритм store, а затем сжать полученный zip-файл, используя алгоритм дефляции по умолчанию.

2 голосов
/ 20 марта 2011

Многое зависит от сети, которую вы используете. Если это через Интернет - вам лучше отправить (скажем) 50 заархивированных файлов, а не один файл. Если вы передаете данные в одном файле, и копирование файла не удается - вам придется отправить его снова.

Копирование в виде отдельных файлов позволит вам передавать некоторые файлы параллельно и минимизировать риск сбоя при большой загрузке.

0 голосов
/ 20 марта 2011

Другой возможностью может быть переключение на другой механизм сериализации.Сериализация JBoss совместима с API и функциональностью, но выдает на 30% меньше данных.

...