大数据量的DataSet压缩方法比较
【IT168 技术文档】
对于在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()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()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()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资源占用率的也让人无法接受。
0
相关文章
