大数据量(16M)DataSet压缩方法比较

来源:互联网 发布:php设计模式应用 编辑:程序博客网 时间:2024/05/16 09:27
对于在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)
 
原创粉丝点击