大數據量(16M)的DataSet壓縮方法比較

對於在WebService上必須(無法避免的情況下)要傳輸大量數據的DataSet時,對DataSet壓縮是最好的方法,這樣可以減少大量在網絡傳輸過程中所佔用的時間。 
下面對我掌握的的DataSet壓縮方法做一個測試,希望高人有斧正之處,也希望需要的人有借鑑之處。 
注:經過壓縮DataSet的WebService就缺少了通用性,請權衡使用之。 
 
測試源碼(僅壓縮部分)和結果如下: 
條件:壓縮前的DataSet的大小爲16891323字節(大約16.12M)。 
環境:.Net  Formatwork  1.1 
系統:  Windows  XP  SP1 
硬件:P4(2.4G)  +  256DDR 
 
方案1:DataSetSurrogate  +  BinaryFormatter 
       Public  Function  DataSetToByte(ByVal  DataSet  As  DataSet)  As  Byte() 
               Dim  DSS  As  New  DataSetSurrogate(DataSet) 
               Dim  MS  As  New  IO.MemoryStream 
               Dim  BF  As  New  BinaryFormatter 
               BF.Serialize(MS,  DSS) 
               Dim  ReVal()  As  Byte  =  MS.ToArray() 
               MS.Close() 
               DSS  =  Nothing 
               MS  =  Nothing 
               BF  =  Nothing 
               Return  ReVal 
       End  Function 
 
方案2:DataSetSurrogate  +  BinaryFormatter  +  SharpZipLib 
       Public  Function  DataSetToByte(ByVal  DataSet  As  DataSet)  As  Byte() 
               Dim  MS  As  New  IO.MemoryStream 
               Dim  ZOS  As  New  ZipOutputStream(MS) 
               ZOS.PutNextEntry(New  ZipEntry(DataSet.DataSetName)) 
               Dim  BF  As  New  BinaryFormatter 
               Dim  DSS  As  DataSetSurrogate  =  New  DataSetSurrogate(DataSet) 
               BF.Serialize(ZOS,  DSS) 
               ZOS.CloseEntry() 
               ZOS.Close() 
               Dim  ReVal  As  Byte()  =  MS.ToArray 
               MS.Close() 
               MS  =  Nothing 
               ZOS  =  Nothing 
               BF  =  Nothing 
               DSS  =  Nothing 
               Return  ReVal 
       End  Function 
 
方案3:zlib 
       Public  Function  DataSetToByte(ByVal  DataSet  As  DataSet)  As  Byte() 
               Dim  MS  As  New  System.IO.MemoryStream 
               DataSet.WriteXml(MS,  XmlWriteMode.WriteSchema) 
               Dim  ReVal()  As  Byte  =  MS.ToArray 
               MS.Close() 
               MS  =  Nothing 
               Dim  zlib  As  New  vbZLib.Compress 
               zlib.CompressByte(ReVal) 
               zlib  =  Nothing                 
               Return  ReVal 
       End  Function 
 
結果(壓縮後): 
方案1:4420881字節(被壓縮掉大約73.83%),耗時:23200ms 
方案2:  696881字節(被壓縮掉大約95.87%),耗時:26621ms 
方案3:  422990字節(被壓縮掉大約97.50%),耗時:    680ms 
 
看來,無論壓縮率還是耗時都是方案3最優,但是使用了第三方組件。前兩個方案對CPU資源佔用率的也讓人無法接受。 
作者:魏滔序  (zhongnian_wei&163.com)
發佈了13 篇原創文章 · 獲贊 2 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章