Есть ли проблема с IO.Compression? - PullRequest
3 голосов
/ 12 февраля 2011

Я только начал сжимать файл в VB.Net, используя следующий код.Поскольку я нацеливаюсь на Fx 2.0, я не могу использовать метод Stream.CopyTo.

Однако мой код дает очень плохие результаты по сравнению с профилем сжатия gzip Normal в 7-zip.Например, мой код сжал архив Outlook 630 МБ до 740 МБ, а 7-zip сделал его 490 МБ.

Вот код.Есть явная ошибка (или много?)

Using Input As New IO.FileStream(SourceFile, IO.FileMode.Open, IO.FileAccess.Read, IO.FileShare.Read)
    Using outFile As IO.FileStream = IO.File.Create(DestFile)
        Using Compress As IO.Compression.GZipStream = New IO.Compression.GZipStream(outFile, IO.Compression.CompressionMode.Compress)
            'TODO: Figure out the right buffer size.'
            Dim Buffer(524228) As Byte
            Dim ReadBytes As Integer = 0

            While True
                ReadBytes = Input.Read(Buffer, 0, Buffer.Length)
                If ReadBytes <= 0 Then Exit While
                Compress.Write(Buffer, 0, ReadBytes)
            End While
        End Using
    End Using
End Using

Я пробовал с несколькими размерами буфера, но у меня схожее время сжатия и точно такая же степень сжатия.

Ответы [ 3 ]

5 голосов
/ 12 февраля 2011

РЕДАКТИРОВАТЬ или фактически переписать: Похоже, что кодеры BCL решили позвонить по телефону .

Реализация в System.dll версии 2.0 использует статически определенные, жестко закодированные деревья Хаффмана , оптимизированные для простого текста ASCII, вместо адаптивной генерации деревьев Хаффмана, как это делают другие реализации. Он также не поддерживает оптимизацию хранимых блоков (именно так стандартная утилита GZip / Deflate позволяет избежать быстрого расширения). В результате выполнение любого вида файла через их реализацию, отличного от простого текста, приведет к созданию файла намного большего размера, чем ввод, и Microsoft утверждает, что это сделано специально *

Избавьте себя от боли, возьмите стороннюю реализацию .

1 голос
/ 12 февраля 2011

IO. Сжатие не было сделано для нас. Была создана поддержка XPS или XML Paper Specificatin. В настоящее время вы должны использовать стороннюю библиотеку, если вы хотите приличное сжатие файлов.

0 голосов
/ 14 апреля 2013

Некоторая дополнительная информация, которая может быть полезна.Я сжимал некоторые статические файлы (двоичные файлы) для включения в выпуск проекта, и у меня возникла та же проблема, когда размер файла увеличился с помощью IO.Compression.GZipStream.

Вместо этого я решил использовать Ionic.Zip там, где наилучшее сжатиеможно использовать.

Одна вещь, которую я сразу заметил, это то, что, хотя Ionic.Zip уменьшил мои файлы до 25% от их первоначального размера, действие сжатия было примерно в 3-4 раза медленнее (что вполне ожидаемо), но процесс разархивированиятакже был в 3 раза медленнее, что сделало распаковку занявшей 1,6 секунды по сравнению с 0,5 секундами.

Поскольку GZipStream является стандартом, даже несмотря на то, что встроенный IO.Compression.GZipStream в .NET был намного менее компактным,распаковка была намного быстрее.

Поэтому я использую обе библиотеки Ionic.Zip " ZLib.GZipStream " до Сжатие файлов и " IO.Compression.GZipStream"до Распаковка файлов намного быстрее в производстве.

...