2015-09-03 3 views
3

Я использовал java-репозиторий adrien grand, предоставляя JNI исходному коде LZ4.Эффективное сжатие нескольких файлов LZ4 с использованием java

Я хочу сжать несколько файлов в заданном каталоге ввода, но LZ4 не поддерживает множественное сжатие файлов, как в java-zip-пакете, поэтому я попробовал другой подход, в котором я думал, что tar все мои входные файлы и передают его в качестве входных данных к компрессору LZ4, и я использовал пакет Jtar java для тарификации всех моих входных файлов. Есть ли другой лучший способ, кроме этого?

Я столкнулся с множеством примеров кода, чтобы сжать некоторые строки и как правильно реализовать компрессор и декомпрессор LZ4. Теперь я хотел знать, как реально реализовать его для нескольких файлов?Я также хотел уточнить, иду ли я в правильном направлении.

После загрузки всех файлов, в соответствии с объяснением использования примера кода, я должен преобразовать свой файл с данными в массив байтов, чтобы предоставить его модулю компрессора. Для этой цели я использовал пакет apache-common-ioutil. Поэтому, учитывая, что у меня много файлов в качестве входных данных, и которые приводят к дег огромного размера, преобразование его всегда в байтовый массив кажется неэффективным по мне. Я хотел сначала узнать, эффективен это или нет? или лучше ли использовать LZ4-пакет лучше этого?

Другой проблемой, с которой я столкнулся, был конечный результат. После сжатия записанных файлов я получаю конечный результат, например файл MyResult.lz4, но я не смог его распаковать с помощью диспетчера архива (я использую ubuntu), так как он не поддерживает этот формат. Я также не понимаю формат архива и сжатия, который я должен использовать здесь. Я также хочу знать, в каком формате должен быть конечный результат. Итак, теперь я говорю с точки зрения пользователя, рассмотрим случай, когда я создаю резервную копию для пользователя, если я предоставляю его/ее традиционным. zip, .gz или любых известных форматов, пользователь мог бы самостоятельно распаковать его. Насколько я знаю, LZ4 не означает, что я должен ожидать, что пользователь также должен знать такой формат правильно? Возможно, он даже смущен, увидев такой формат. Таким образом, это означает, что преобразование с .lz4 в формат .zip также кажется бессмысленным. Я уже вижу процесс тарификации всех моих входных файлов в качестве трудоемкого процесса, , поэтому я хотел знать, насколько это влияет на производительность. Как я видел в пакете java zip, сжимающем несколько входных файлов, похоже, не проблема. Итак, рядом с lz4 я столкнулся с общим сжатием Apache и TrueZIP. Я также наткнулся на несколько строк переполнения стека, которые помогли мне многому научиться. На данный момент я действительно хотел использовать LZ4 для сжатия, особенно из-за его производительности, но я столкнулся с этими препятствиями. Любой, кто имеет хорошие знания о пакете LZ4, предлагает решения для всех моих запросов и проблем вместе с простой реализацией. Благодарю.

Время я вычислил для входа, состоящей из множества файлов,
Время, затраченное на тарирования: 4704 мс
Время, необходимое для преобразования файла в массив байтов: 7 мс
Время, затраченное на сжатие: 33 мс

ответ

3

Некоторые факты:

  1. LZ4 здесь ничем не отличается от GZIP: это проект с одним концертом, касающийся сжатия. Он не занимается архивной структурой. Это намеренно.
  2. LZ4 lib Adrien Grand выпускает выходные данные, несовместимые с утилитой LZ4 командной строки. Это также преднамеренно.
  3. Ваш подход с смолой кажется ОК, потому что так оно и делается с GZIP.

В идеале вы должны заставить tar-код создать поток, который сразу же сжимается, а не полностью полностью хранится в ОЗУ. Это достигается в командной строке, используя Unix-каналы.

1

У меня была та же проблема. Текущая версия LZ4 для Java несовместима с более поздним разработанным стандартом LZ4 для обработки потоков, однако в репо проектов есть патч, поддерживающий стандарт сжатия/распаковки потоков, и я могу подтвердить, что он совместим с командной строкой инструмент. Вы можете найти его здесь https://github.com/jpountz/lz4-java/pull/61.

В Java вы можете использовать это вместе с TarArchiveInputStream из сжатия Apache Commons.

Если вы хотите пример, код, который я использую в артефакт Maven io.github.htools 0,27-фотоснимка (или на GitHub) классы io.github.htools.io.compressed.TarLz4FileWriter и (устаревшее class) io.github.htools.io.compressed.TarLz4File показать, как это работает. В HTools tar и lz4 автоматически используются через ArchiveFile.getReader (String filename) и ArchiveFileWriter (String filename, int compressionlevel), если ваше имя файла заканчивается на .tar.lz4

Смежные вопросы