Привет «ХабраСообщество»! Публикую краткий обзор и результаты тестирования основных алгоритмов сжатия с помощью Java. Для интересующихся прошу скидку; для тех, кто нет, просьба не минусовать и говорить, что тема не достойна хабра - помещу ее в черновики.
Так:
- SteriaLZH — это реализация алгоритма lzh, который на данный момент актуален в проекте, над которым работает компания, и из-за чего возникла задача найти лучшую альтернативу.
- Не все найденные алгоритмы (реализации сжатия файлов и данных) были протестированы.
Например JZip от JCraft и еще несколько, все что я тестировал можно увидеть в табличке.
- Тестировалось только сжатие, декомпрессия не тестировалась.
- В ходе тестирования рассчитывались 5 параметров: степень сжатия, минимальное время [мс], среднее время [мс], медианное время [мс], максимальное время [мс].
- хорошие компрессоры прогоняли файлы 1000 раз, а не 10. Ниже табличка что, сколько и для чего.
- поток — реализация (алгоритмы): принимаем имя файла, затем соответственно читаем файл в InputStream и создаем (сохраняем) с помощью OutputStream.
- блок — реализация (алгоритмы): мы принимаем файл как байт[], сжимаем его и получаем обратно сжатый байт[].
- При потоковом сжатии сжатые файлы удалялись перед повторным созданием.
- протестировано на Lenovo thinkpad T420 (Intel Core i5-2540M, процессор 2,6 ГГц, 4 ГБ ОЗУ), WinXP: SP3.
Таблица, показывающая, что запускалось и сколько раз:
Стерия.
ЛЖ 100
java.util.zip.GZIP(поток) 1000
java.util.zip.Deflater.BEST_COMPRESSION (блок) 1000
java.util.zip.Deflater.BEST_SPEED (блок) 1000
java.util.zip.Deflater.HUFFMAN_ONLY (блок) 1000
apache.commons.compress.BZIP2 (поток) 10
apache.commons.compress.GZIP (поток) 1000
apache.commons.compress.XZ (поток) 10
com.ning.LZF (блок) 1000
com.ning.LZF (поток) 10
QuickLZ (блок) 1000
org.xerial.snappy.Snappy (блок) 1000
Вот так были сделаны замеры.
Код — мое творение, у каждого свой стиль.
Так что прошу вас не слишком обсуждать ПРАВИЛЬНОСТЬ.
время: для каждого отдельного алгоритма (реализации) был создан класс с публичной функцией, которую я вызываю, передавая ее в качестве аргумента или пути к файлу или байту[].
start = System.nanoTime(); byte[] compressedArray = compressor.compressing(arrayToCompress); end = System.nanoTime(); resultTime = end - start; start = System.nanoTime(); compressor.compressing(fileToCompress); end = System.nanoTime(); resultTime = end - start;
Измерение минимального времени [мс], среднего времени [мс], медианного времени [мс], максимального времени [мс]: все измеренные значения времени конкретного файла были получены в ArrayList.
private void minMaxMedianAverCalculation(int element) {
ResultsSaver resultsSaver = (ResultsSaver) compressorsResults.get(activeTest);
ArrayList<Long> elementsList = new ArrayList<Long>();
for (int i = 0; i < TEST_COUNT; i++) {
long timeElement = resultsSaver.getNanoSecondsTime(i, element);
elementsList.add(timeElement);
}
Collections.sort(elementsList);
this.min = (elementsList.get(0)) / 1000000;
this.max = (elementsList.get(elementsList.size() - 1)) / 1000000;
int elementsListLength = elementsList.size();
if (elementsListLength % 2 == 0) {
int m1 = (elementsListLength - 1) / 2;
int m2 = m1 + 1;
this.median = ((elementsList.get(m1) + elementsList.get(m2)) / 2) / 1000000;
} else {
int m = elementsListLength / 2;
this.median = elementsList.get(m) / 1000000;
}
long totalTime = 0;
for (int i = 0; i < elementsListLength; i++) {
totalTime += elementsList.get(i);
}
this.average = (totalTime / TEST_COUNT)/1000000;
}
Измерение степени сжатия потока:
private void setStreamCompressionRatio(String toCompressFileName, String compressedFileName) {
ResultsSaver resultsSaver = (ResultsSaver) compressorsResults.get(activeTest);
File fileToCompress = new File(toCompressFileName);
long fileToCompressSize = fileToCompress.length();
File compressedFile = new File(compressedFileName);
long compressedFileSize = compressedFile.length();
double compressPercent = Math.round(((double) compressedFileSize * 100) / fileToCompressSize * 100) / 100.0d;
resultsSaver.setCompressionRatio(compressPercent);
}
Измерение степени сжатия блока:
private void setBlockCompressionRatio(byte[] arrayToCompress, byte[] compressedArray) {
ResultsSaver resultsSaver = (ResultsSaver) compressorsResults.get(activeTest);
long arrayToCompressSize = arrayToCompress.length;
long compressedArraySize = compressedArray.length;
double compressPercent = Math.round(((double) compressedArraySize * 100) / arrayToCompressSize * 100) / 100.0d;
resultsSaver.setCompressionRatio(compressPercent);
}
Что было сжато:
TextDat_1Kb.txt – простой текст какой-нибудь статьи из Википедии (на английском языке).TextDat_100Kb.txt — простой текст некоторых статей из Википедии (англ.
).
TextDat_1000Kb.txt — простой текст некоторых статей из Википедии (английский, немецкий, испанский.
).
PdfDat_200Kb.pdf – то же, что *.
doc, только преобразованный и скорректированный по размеру.
PdfDat_1000Kb.pdf – то же, что *.
doc, только преобразованный и скорректированный по размеру.
PdfDat_2000Kb.pdf – то же, что *.
doc, только преобразованный и скорректированный по размеру.
HtmlDat_10Kb.htm – текст какой-то документации без картинок с тегами, то есть в формате html. HtmlDat_100Kb.htm – текст какой-то документации без картинок с тегами, то есть в формате html. HtmlDat_1000Kb.htm – текст какой-то документации без картинок с тегами, то есть в формате html. ExcelDat_200Kb.xls – заполняется случайными числами от 0 до 1 с помощью функции Excel random().
ExcelDat_1000Kb.xls – заполняется случайными числами от 0 до 1 с помощью функции Excel random().
ExcelDat_2000Kb.xls – заполняется случайными числами от 0 до 1 с помощью функции Excel random().
DocDat_500Kb.doc - тексты статей из Википедии с несколькими картинками (английский, немецкий, испанский.
).
DocDat_1000Kb.doc - тексты статей из Википедии с несколькими картинками (английский, немецкий, испанский.
).
DocDat_2000Kb.doc - тексты статей из Википедии с несколькими картинками (английский, немецкий, испанский.
).
HtmDat_30000Kb.htm – форматированный текст и таблицы с цифрами.
Иииии, результаты: habrastorage.org - он выдал следующие картинки, полный размер 1800*615, может кто знает как увеличить по клику?
… Я сделал это правильно, не правильно, надеюсь, я сделал это правильно, но я сделал это! Любой, у кого есть мысли, готов к критике! Выкладываю - может кому-то будет полезно.
Некоторые результаты мне кажутся странными, но цифры, которые получились в итоге, — это то, что я занес в таблицу.
Не знаю, можно ли аккуратно вставлять таблицы Excel, поэтому кидаю картинки.
Если кому нужен excel файл, выложу без проблем.
P.S. Спасибо за внимание, рад, что вы дочитали до конца.
:) Теги: #java #Алгоритмы #тестирование #сжатие данных #тестирование ИТ-систем #java #Алгоритмы
-
Опять Мошенники. Сейчас В Ирландии
19 Oct, 24 -
Выпущена Pc-Bsd 8.0
19 Oct, 24 -
Directx 10 Привлечет Геймеров В Vista
19 Oct, 24