Ответ 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.");
}
}