GZipStream/DeflateStream 在壓縮二進位檔會造成檔案放大

這篇是向 CSS 問問題的,請參考。
 
問題

標題:
GZipStream/DeflateStream 在壓縮二進位檔會造成檔案放大
(.Net framework 2.0 內建類別。)
  
造成問題:
二進位檔放大後反而增加網路傳輸流量,無壓縮效果。
  
重現步驟:
1.
為了方便說明起見,範例採用 MSDN 線上完整範例,請於下列位置下載 CompressionSample.zip.exe:
  
2.
下載安裝後,請開啟子目錄內解決方案並執行
CompressionSample.zip\compressionsample\VB\CompressionVB.sln
  
3.
建立壓縮檔
選單 File -> New GZip -> test.xip
  
4.
加入二進位檔,例如本信附件 i08_irfan.png
選單 Actions -> Add
  
結果如圖,可由圖中看出,原先檔案大小 (Size) 為 58618 bytes 壓縮後大小 (Compressed size) 放大為 88955 bytes 。
  
補充說明:
1.
文字檔有效縮小,可達到壓縮效果。
  
2.
  
所得大小亦為 88955 ,與 MSDN 範例同。
  
3.
DeflateStream 亦有相同結果,大小放大為 88937 bytes 。
  
4.
若以 tar 類型檔案為壓縮測試例,透過 GZipStream 類別壓縮為 tar.gz 後,仍可用一般解壓縮軟體完成解壓縮,如附件 small.tar (146432 bytes) ,但一般解壓縮軟體 (ALZip) 壓縮成為 tar.gz 時,僅 133327 bytes ,但用 .Net 類別 GZipStream 後,放大為 202574 bytes 。
  
連絡資訊:
姓名:鄭子璉
電話:xxxxxxxxxx / xxxxxxxxxx
技術支援服務合約編號:xxxxxxxxx
  

 
CSS 回覆:

Sent: Friday, July 13, 2007 6:13 PM
Subject: 微軟回覆您的問題(SRT070711807282) – GZipStream/DeflateStream 在壓縮二進位檔會造成檔案放大 

鄭先生您好:
謝謝您的來電。敝姓林,我是台灣微軟技術支援工程師,很榮幸有機會為您服務。關於您遇到的問題,請參考以下報告。若步驟中有任何不清楚或需要進一步的協助,為避免我們因在電話中而耽誤接聽您電話的時間,建議您先以 EMAIL 方式回覆給我,我將在收到您的來信後儘速與您連絡,謝謝。

問題代號SRT070711807282 

 

 

問題描述GZipStream/DeflateStream 在壓縮二進位檔會造成檔案放大 

.NET 2.0 內建的兩個類別 GZipStream/DeflateStream 壓縮二進位檔,壓縮後檔案會放大,此問題反而會使網路傳輸流量增加,而無原本預計應達到的壓縮效果。 

 

解決方法︰ 

這是一個已知的情形,在 GZipStream/DeflateStream 這兩個壓縮類別預設的設計上,當其在壓縮檔案前並沒有檢查其是否為 “incompressible data”,對已經壓縮過的檔案再次進行壓縮(例如: png, gif, jpg, mp3 檔案),就會造成上述情形。

 

此外,以此兩個類別對某些二進位檔案進行壓縮,亦可能發生上述現象。

 

此問題已經反應給開發團隊,開發團隊目前正考慮是否在下一個版本修正此問題

 

 

 

請您參考上述資訊,若有任何不清楚或需要進一步協助,請儘速與我連絡,謝謝!

 

技術支援工程師 Support Engineer
Developer Support Team
Global Technical Support Center – Taiwan
技術支援服務首頁: http://support.microsoft.com
技術支援專線: 0800-008-833(市話專用)/ 02-2999-8833

廣告
Categories: 更新與回報 | 2 則迴響

文章分頁導航

2 thoughts on “GZipStream/DeflateStream 在壓縮二進位檔會造成檔案放大

  1. 子璉

    目前獲知訊息為先修改說明文件,至於會不會更新該類別還不確定。
     
    Sent: Monday, September 10, 2007 10:25 AM
    To: qvb3377@ms5.hinet.net
    Subject: RE: 微軟結案確認函(SRT070711807282) – GZipStream/DeflateStream 在壓縮二進位檔會造成檔案放大

    鄭先生您好:

    不知是否下列說明能符合您的要求

    http://msdn2.microsoft.com/en-us/library/system.io.compression.gzipstream.aspxhttp://msdn2.microsoft.com/en-us/library/system.io.compression.deflatestream.aspx

    The compression functionality in DeflateStream and GZipStream is exposed as a stream. Data is read in on a byte-by-byte basis, so it is not possible to perform multiple passes to determine the best method for compressing entire files or large blocks of data. The DeflateStream and GZipStream classes are best used on uncompressed sources of data. If the source data is already compressed, using these classes may actually increase the size of the stream.

    Thanks, 

    按讚數

  2. 子璉

    中文版的說明也有更新:
    http://msdn2.microsoft.com/zh-tw/library/system.io.compression.gzipstream.aspx
     http://msdn2.microsoft.com/zh-tw/library/system.io.compression.deflatestream.aspx
    DeflateStream 和 GZipStream 中的壓縮功能會公開 (Expose) 為資料流。由於資料的讀取方式是以位元組為單位逐一讀取,因此無法執行多項傳遞作業來判斷壓縮所有檔案或大型資料區塊的最佳方式。DeflateStream 和 GZipStream 類別的最佳使用方式是用於未壓縮的資料來源。如果來源資料已經壓縮,使用這些類別可能會增加資料流的實際大小。

    按讚數

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s

在WordPress.com寫網誌.

%d 位部落客按了讚: