Есть ли способ предварительно определить, является ли файл хорошим кандидатом на сжатие? - PullRequest
1 голос
/ 09 марта 2011

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

Использование HTTP-сжатия не всегда будет возможным, и в этом случае проекта предпочтительнее тратить больше клиентской обработки, чем пропускной способности или серверного хранилища.Но было бы действительно лучше, если бы мы могли пропустить процесс сжатия, если бы мы могли определить, даст ли сжатие реальные результаты.

Я знаю, что «правильного ответа» нет, но мы будем признательны за любые идеи.

Ответы [ 6 ]

5 голосов
/ 09 марта 2011

Фильтрация по Типы файлов - хорошая идея.Даже если некоторые файлы имеют неправильные расширения, в целом это хорошая ставка.

Например, текстовые файлы сжимаются очень хорошо.При сжатии файлов mp3, jpg's / gifs или divx мало что нужно.

2 голосов
/ 09 марта 2011

Учитывая то, что вы говорите о расширениях, я вижу несколько способов

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

Второе: более простой hurestic - это взять100 байтов от середины файла и посмотрите, является ли это стандартным ascii, например, каждый байт имеет значение между 9 и 126. Это будет неправильно в определенный процент времени, не будет работать с текстом на многих языках и не будет работатьна тексте Юникод.

1 голос
/ 09 марта 2011

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

0 голосов
/ 09 марта 2011

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

Одна вещь, с которой вы должны быть осторожны при таком подходе, состоит в том, что многие форматы файлов могут иметь свои первые "несколько" КБ в виде заголовков, не представляющих остальную часть файла. Таким образом, вы можете увеличить размер выборки, взять образец из другой части файла, взять несколько подвыборок из разных частей файла, чтобы сформировать образец, и т. Д.

0 голосов
/ 09 марта 2011

Вы можете получить указатель, выполнив анализ частоты байтов, возможно, также с шагом MTF, чтобы преобразовать локальное повторение в нечто более измеримое. Стоимость дешевая, линейное сканирование файла.

0 голосов
/ 09 марта 2011

Вы можете попробовать сжать файл очень быстрым компрессором.Если компрессор не может сжать его достаточно, то бесполезно пытаться сжать его лучше.Да, это глупая идея, но технически .zip-файл может содержать txt-файл, использующий «сохраненный» формат (без сжатия), и этот .zip будет очень сжимаемым, поэтому волшебной пули не будет.

(технически вы можете измерить энтропию файла, но затем, как предлагается здесь Как рассчитать энтропию файла? , распакуйте его для проверки :-))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...