惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

月光博客
月光博客
C
Check Point Blog
J
Java Code Geeks
腾讯CDC
Apple Machine Learning Research
Apple Machine Learning Research
宝玉的分享
宝玉的分享
Microsoft Azure Blog
Microsoft Azure Blog
WordPress大学
WordPress大学
量子位
Google DeepMind News
Google DeepMind News
I
InfoQ
The GitHub Blog
The GitHub Blog
aimingoo的专栏
aimingoo的专栏
N
Netflix TechBlog - Medium
Hugging Face - Blog
Hugging Face - Blog
博客园 - Franky
V
V2EX
Blog — PlanetScale
Blog — PlanetScale
T
The Blog of Author Tim Ferriss
小众软件
小众软件
博客园_首页
人人都是产品经理
人人都是产品经理
博客园 - 聂微东
IT之家
IT之家

博客园 - AnsonWu

[转载]Remoting随想 [转]Remoting之同步—异步调用 [转]正则表达式30分钟入门教程 准备写一个智能提示的控件,大家有什么好的思路 javascript函数库 推荐一个免费的数据库开发工具 Asp.net Ajax 设计模式-原型模式 关于反射的一点理解(一) 设计模式--工厂方法 如何用SQLDMO在ASP.NET页面下实现数据库的备份与恢复 .NET开源项目介绍及资源推荐:数据持久层 在asp.net中如何从视频文件中抓取一桢并生成图像文件 使用AppUpdater组件(转) NHibernate初体验 <转> ASP.net的RUL重写 开发 Windows Mobile 应用程序 FAQ(转) Ajax for Java developers: Ajax with Direct Web Remoting 手机壁纸切割器源码发布
从WEB SERVICE 中数据压缩策略(转)
AnsonWu · 2007-04-11 · via 博客园 - AnsonWu

前段时间在做一个项目的时候,遇到了要通过WEB SERVICE从服务器上返回数据量比较大的DATASET,当然,除了显示在页面上以外,有可能还要用这些数据在客户端进行其它操作。查遍了网站的文章,问了一些朋友,也找了一些解决方法.
       
众所周知,如果不用其它方法,直接从WEB SERVICE上传回一个10W条记录的DATASET,可想而知的后果是什么,CPU要占用 100%,且要等上几分钟,这是任何一个项目都无法忍受的.在我上网找资料的过程中,试验了几种不同的方法,通过压缩SOAP改善XML Web service性能,
这篇文章所介绍的方法用了SOAP扩展,是通过在WEB SERVICE端用已经过时了的NZIPLIB库来压缩SOAP响应,据称文本压缩率可达80%.文章里面的代码是VB.NET,费了好大劲翻译成C#,照上面建项目,但是很可惜,我没有编译成功,总是出错.
这里我找我建好的项目提供大家下载,大家有时间看看是什么问题.
SOAP压缩代码下载
      
而后,找到了用序列化的方式来减少网络传输量,Microsoft .NET Framework 1.x 中内建两种将物件序列化的 Formatter类别,SoapFormatter BinaryFormatter,两种方式均能减轻网络传输量提高性能,SoapFormatter方式传输的方式其实还是XML形式,加了很多XML标识,因此压缩率不是很理想,BinaryFormatter用纯二进制的方式序列化DATASET,能使压缩率大大提高,这是台湾作者李匡正 (台灣微軟應用架構技術經理提供的例子里对SQL范例库Northwind的测试结果:

SoapFormatter 

BinaryFormatter 

Dataset 序列化後 Bytes 數 

1,953,078

1,448,399 

很显示然BinaryFormatter 明显优于SoapFormatter ,而我也确实用了BinaryFormatter 这种方式实现了提高效率.
再者,用微软提供的DataSetSurrogate 类可以此基础上进一步压缩数据大小,DataSetSurrogate 在.net 2.0里自带。这是比较结果.

  SoapFormatter BinaryFormatter
Dataset 序列化後Bytes數 1,953,078 1,448,399
DataSetSurrogate 序列化後Bytes數 2,371,942 575,684

在这里,有两种方式:可把序列化后的数据用文件形式保存在客户端硬盘;也可用Byte[]方式传回客户端,以下是代码。
web service 端(文件形式)
客户端

web service 端(Byte[]方式)


客户端
   


我个人觉得用byte[]方式会安全些,毕竟不用在客户端产生文件,不用担心数据的安全。

当 然作为从网络上读取数据来说,10W条是一个不小量,所有的方式包括压缩,序列化等都是权宜之计,而不是长久之计,在使用当中,我用以上的方法虽然能使网 络传输量降低,且可在很短时间内就把数据显示在DATAGRID上,但CPU的开销却达到了100%,这是我一直头疼的。我后来又用了分页的方式,把 10W条数据在服务器端就分批取出,每次500条,这样读取时间延长了,但CPU开销却未减轻很多,再后来,又用多线程的方式处理,不甚理想。因此最好的 方法就是尽可能的不查询10W条数据,通过条件判断等方式减少所需处理的数据量。


本文从以下文章里借鉴:
http://www.dotnetjunkies.com/PrintContent.aspx?type=tutorial&id=46630AE2-1C79-4D5F-827E-6C2857FF1D23http://blog.joycode.com/5drush/archive/2004/05/28/22990.aspxhttp://www.chinacs.net/archives/11/2004/08/10/2155.html
http://www.microsoft.com/taiwan/msdn/columns/adonet/AdoNet_20041231.htmhttp://www.microsoft.com/china/msdn/library/langtool/vcsharp/miszipcompression.mspx