Подтвердить что ты не робот

Быстрое сжатие в Java?

Есть ли очень быстрая библиотека сжатия для Java? Стандартная библиотека gzip медленнее, чем хотелось бы. Я ищу что-то похожее на http://www.oberhumer.com/opensource/lzo/ собственный код Java, который обеспечивает быстрое сжатие и декомпрессию. Спасибо!

Несколько других библиотек быстрого сжатия для дальнейшего использования:

QuickLZ - C/С#/Java - GPL или коммерческий http://www.quicklz.com/

libLZF - C - лицензия на стиль BSD http://oldhome.schmorp.de/marc/liblzf.html

FastLZ - C - лицензия на стиль MIT http://fastlz.org/

LZO C - GPL или коммерческий http://www.oberhumer.com/opensource/lzo/

zlib - C/Java (GZIP и deflate) - Коммерческая лицензия http://zlib.net/

Интеграция Hadoop-LZO (JNI): http://github.com/kevinweil/hadoop-lzo

Snappy-Java (JNI): https://github.com/xerial/snappy-java

Контрольные показатели пользователей QuickLZ: http://www.quicklz.com/bench.html

4b9b3361

Ответ 1

Вы можете использовать DeflatorOutputStream и InflatorInputStream. Оба используют сжатие LZW. Вы можете просто использовать библиотеку, которую они предоставляют.

EDIT: производительность в реальном времени обычно измеряется с точки зрения задержки, однако вы указываете числа с точки зрения пропускной способности. Не могли бы вы уточнить, что вы имеете в виду в режиме реального времени.

Для латентности, используя BEST_SPEED, каждый вызов в среднем составлял 220 нс + 13 нс/байт.

Примечание. В ситуациях с низкой задержкой часто возникает многократная латентность, которую вы можете ожидать, когда процессор работает "горячим". Вы выполняете время в реальной ситуации.

EDIT: Это коэффициенты сжатия, которые я получил с обновлением Java 6 21;

Raw OutputStream.write() - 2485 MB/sec

Deflator.NO_COMPRESSION - 99 MB/s

Deflator.BEST_SPEED - 85 MB/s.

Deflator.FILTERED - 77 MB/s

Deflator.HUFFMAN_ONLY - 79 MB/s

Deflator.DEFAULT_COMPRESSION - 30 MB/s

Deflator.BEST_COMPRESSION - 14 MB/s

Примечание. Я не уверен, почему настройка по умолчанию быстрее, чем настройка "наилучшей скорости". Я могу только предположить, что первая была оптимизирована.

Размер выходного буфера был 4 КБ, вы можете найти другой размер, который лучше всего подходит для вас.

EDIT: следующий код печатает для большого CSV файла. Задержка для блока 5 КБ.

Average latency 48532 ns. Bandwidth 91.0 MB/s.
Average latency 52560 ns. Bandwidth 83.0 MB/s.
Average latency 47602 ns. Bandwidth 93.0 MB/s.
Average latency 51099 ns. Bandwidth 86.0 MB/s.
Average latency 47695 ns. Bandwidth 93.0 MB/s.

.

public class Main {
    public static void main(String... args) throws IOException {
        final String filename = args[0];
        final File file = new File(filename);
        DataInputStream dis = new DataInputStream(new FileInputStream(file));
        byte[] bytes = new byte[(int) file.length()];
        dis.readFully(bytes);
        test(bytes, false);
        for (int i = 0; i < 5; i++)
            test(bytes, true);
    }

    private static void test(byte[] bytes, boolean print) throws IOException {
        OutputStream out = new ByteOutputStream(bytes.length);
        Deflater def = new Deflater(Deflator.BEST_SPEED);
        DeflaterOutputStream dos = new DeflaterOutputStream(out, def, 4 * 1024);
        long start = System.nanoTime();
        int count = 0;
        int size = 5 * 1024;
        for (int i = 0; i < bytes.length - size; i += size, count++) {
            dos.write(bytes, i, size);
            dos.flush();
        }
        dos.close();
        long time = System.nanoTime() - start;
        long latency = time / count;
        // 1 byte per ns = 1000 MB/s.
        long bandwidth = (count * size * 1000L) / time;
        if (print)
            System.out.println("Average latency " + latency + " ns. Bandwidth " + bandwidth + " MB/s.");    
    }
}

Ответ 2

Больше веселее: в github есть быстрая чистая Java-версия Snappy. В настоящее время это самый быстрый чистый java-кодек и, возможно, самый быстрый кодек из Java, включая кодеки C (поскольку он близок по скорости к встроенному кодеку Snappy, доступному через JNI).

Итак, есть 3 быстрых декомпрессора Java: Snappy, LZF и LZ4 (см. https://github.com/ning/jvm-compressor-benchmark) для деталей

EDIT (август 2013): LZ4 в настоящее время является самым быстрым кодеком; Snappy и LZF используют второй слот. Все прогрессировали хорошо за прошлый год или около того, и значительно быстрее, чем GZIP.

Ответ 3

Еще один; очень эффективная (оптимизированная, ориентированная на Java) реализация LZF на https://github.com/ning/compress. Быстрее для декомпрессии, чем дефляция (gzip), 2x или около того; и МНОГО быстрее для сжатия (3x - 5x). Скорость сжатия ниже, так как это только первая часть дефлята (Lempel-Ziv), без второй части (кодировка хаффмана); это объясняет большую часть скорости.

Числа в соответствии с бенчмарком компрессора JVM: https://github.com/ning/jvm-compressor-benchmark

Ответ 4

Самые быстрые чистые Java-реализации LZ4 и Snappy находятся здесь: https://code.google.com/p/kanzi/ Здесь приведена страница, сравнивающая производительность различных java-реализаций: https://code.google.com/p/kanzi/wiki/SnappyCodec. LZ4 работает быстрее и имеет лучшую степень сжатия (обычно) с небольшим отрывом.

Ответ 5

Я обнаружил, что время декомпрессии с использованием LZ4 (net.jpountz.lz4 lz4-1.2.0.jar) до 60 раз быстрее, чем время декомпрессии, используя GZIPInputStream. Но сжатые размеры близки (сжатый размер lz примерно на 6% больше).

Здесь приведены времена декомпрессии для различных версий, усредненные по нескольким повторениям. Каждый rep распаковывал сжатый массив байтов 1000 раз.

> 0.01 milliseconds for lz4 (native instance),
> 0.03 milliseconds for lz4 (safe instance)
> 0.05 milliseconds for lz4 (unsafe instance)
> 0.05 milliseconds for lz4 ("fastest" instance)
> 0.05 milliseconds for lz4 ("fastest Java" instance)
> 0.74 milliseconds for gzip (GZIPInputStream)