Java - Рассчитать сжатие файлов - PullRequest
0 голосов
/ 09 января 2012

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

например,
Compression Ratio: 50% -> Я могу сэкономить 50% пространства моего файла, если я сожму его
Compression Ratio: 99% -> Я могу сэкономить только 1% пространства моего файла, если я сожму егоон

Ответы [ 3 ]

2 голосов
/ 09 января 2012

Во-первых, это будет во многом зависеть от выбранного вами метода сжатия. И во-вторых, я серьезно сомневаюсь, что это возможно без вычисления временной и пространственной сложности, сравнимого с фактическим выполнением сжатия. Я бы сказал, что лучше всего сжать файл, отследить размер того, что вы уже произвели, и отбросить / освободить его (разумеется, когда вы закончите с этим) вместо того, чтобы выписать его.

На самом деле, если вы действительно не хотите реализовать это самостоятельно, вероятно, будет проще всего использовать класс java.util.zip , в частности Deflater класс и его deflate метод.

1 голос
/ 09 января 2012

Во-первых, вам нужно поработать над теорией информации.Существует две теории относительно области теории информации:

  1. Согласно Шеннону, можно вычислить энтропию (то есть сжатый размер) источника, используя его вероятности символа.Таким образом, наименьший размер сжатия определяется статистической моделью, которая создает вероятности символов на каждом шаге.Все алгоритмы используют этот подход неявно или явно для сжатия данных.Посмотрите, что статья в Википедии для более подробной информации.
  2. Согласно Колмогорову, наименьший размер сжатия можно найти, найдя наименьшую возможную программу, которая производит исходный код.В этом смысле он не может быть вычисляемым.Некоторые программы частично используют этот подход для сжатия данных (например, вы можете написать небольшое консольное приложение, которое может генерировать 1 миллион цифр PI вместо того, чтобы архивировать этот миллион цифр PI).

Итак, вы можетенайти сжатый размер без оценки фактического сжатия.Но, если вам нужно приближение, вы можете положиться на теорию энтропии Шеннона и построить простую статистическую модель.Вот очень простое решение:

  1. Вычисление статистики порядка 1 для каждого символа в исходном файле.
  2. Вычисление энтропии с использованием этой статистики.

Ваша оценка будет более или менее такой же, как алгоритм сжатия ZIP по умолчанию (deflate). Здесь - более продвинутая версия той же идеи (имейте в виду, что она использует много памяти!).Он фактически использует энтропию для определения границ блоков, чтобы применить сегментацию для разделения файла на однородные данные.

1 голос
/ 09 января 2012

Невозможно без проверки файла.Единственное, что вы можете сделать, - это получить приблизительное соотношение по расширению файла на основе статистики, полученной из сравнительно большой выборки путем фактического сжатия и измерения.Например, статистический анализ, скорее всего, покажет, что .zip, .jpg не являются сжимаемыми в большой степени, но файлы, такие как .txt и .doc, могут быть в большой степени сжимаемыми.

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

ОБНОВЛЕНИЕ: Предполагая, что вы можете исследовать файл, вы можете использовать API java.util.zip для чтения необработанного файла и сжатия его ипосмотрите, в чем разница до / после.

...