Я хочу написать хранилище для хранения больших фрагментов данных. Данные могут быть любыми, но в основном это двоичные файлы (изображения, pdf, файлы jar) или текстовые файлы (xml, jsp, js, html, java...). Я обнаружил, что большая часть данных уже сжата. Если все сжато, можно сохранить около 15% дискового пространства.
Я ищу наиболее эффективный алгоритм, который может с большой вероятностью предсказать, что фрагмент данных (скажем, 128 КБ) может быть сжат или нет (сжатие без потерь), без необходимости просматривать все данные, если это возможно.
Алгоритм сжатия будет либо LZF, Deflate, либо что-то подобное (возможно, Google Snappy). Поэтому прогнозирование сжимаемости данных должно быть намного быстрее, чем сжатие самих данных и использование меньше памяти.
Алгоритмы, о которых я уже знаю:
-
Попробуйте сжать подмножество данных, скажем 128 байтов (это немного медленнее)
-
Рассчитайте сумму в 128 байт, и если она находится в определенном диапазоне, то она, вероятно, не сжимается (в пределах 10% от 128 * 127) (это быстро и относительно хорошо, но я ищу что-то более надежным, потому что алгоритм действительно смотрит только на верхние биты для каждого байта)
-
Посмотрите на заголовки файлов (относительно надежно, но чувствуете себя обманом)
Я предполагаю, что общая идея заключается в том, что мне нужен алгоритм, который может быстро вычислить, если вероятность каждого бита в списке байтов составляет примерно 0,5.
Update
Я реализовал "ASCII-проверку", "расчет энтропии" и "упрощенное сжатие", и все дают хорошие результаты. Я хочу уточнить алгоритмы, и теперь моя идея - не только предсказать, могут ли данные быть сжаты, но и насколько они могут быть сжаты. Возможно использование комбинации алгоритмов. Теперь, если бы я мог принимать только несколько ответов... Я приму ответ, который дал наилучшие результаты.
Дополнительные ответы (новые идеи) по-прежнему приветствуются! Если возможно, с исходным кодом или ссылками: -)
Обновление 2
Аналогичный метод теперь реализован в Linux.