如果从WEB SERVICE 上返回一个有10W条数据的DATASET,怎么提高效率

flyskywlh 2005-07-29 06:49:55
我现在要做一个模块,要通过WEB SERVICE 访问SQL,可能要连续读几十个表,其中几个表的数据可能达到10W条,那么把这些DATASET返回到本地进行处理,比如插入操作,请问怎么提高效率,我试验过,返回一个10W条记录的DATASET时,CPU已经占用到了98%,请问怎么解决?
...全文
339 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
sleeping100 2005-08-02
  • 打赏
  • 举报
回复
学习。。。
flyskywlh 2005-08-02
  • 打赏
  • 举报
回复
请问有现成的代码吗?我用网上的一篇文章里的代码进行压缩,总是出错,不成功..
ainijin 2005-08-02
  • 打赏
  • 举报
回复
两种方案
1 分页
2 用实体 不要用dataset
flyskywlh 2005-08-01
  • 打赏
  • 举报
回复
TO: KILLERLIU

老兄,我没办法的,我现在要做的是要把服务器上的数据取出,不是作分页用,是要导入到客户端的ACCESS表..
而且要取的表还不是一个,是N个.
killerliu 2005-08-01
  • 打赏
  • 举报
回复
有毛病。。。我只能这么说

如果你实在是要一次取出这么多数据,,那就写个临时表吧。。写完了以后从表里选出适当的数据显示。。分页操作嘛。。。干嘛一次性把所有数据都选出来。。不是摆明了消耗服务器资源吗??
lmpeel 2005-08-01
  • 打赏
  • 举报
回复
什么情况下要一次取这么多数据啊???
CoolBaby25 2005-08-01
  • 打赏
  • 举报
回复
1、优化你的数据库表。
2、所有语句写成存储过程。
3、优化SQL语句。

select top 10分段找出??
表中总有关建列。比如日期等。

写复合语句查寻某个段的数据,本人不提倡这样做。
flyskywlh 2005-08-01
  • 打赏
  • 举报
回复
TO : GUYIGOOD

有没有你说的方法的代码? 怎么把一个大数据集用SELECT TOP 10 分段找出?
guyigood 2005-08-01
  • 打赏
  • 举报
回复
只有控制数据量,才能提高效率,数据表上多使用索引。操作时尽量使用SELECT TOP 10 * FROM 表名来操作,插入语句使用SQL语句就可以了,不要使用DATASET的更新办法,否则惨死。
flyskywlh 2005-08-01
  • 打赏
  • 举报
回复
N天了,还没人回答....

有人做过压缩的方法么?
aijing 2005-08-01
  • 打赏
  • 举报
回复
up
kevin_net 2005-08-01
  • 打赏
  • 举报
回复
返回的数据存成临时的xml文件,然后压缩,压缩后会很小.返回 byte[].
李天平 2005-08-01
  • 打赏
  • 举报
回复


.net与java交互的压缩方式较为简单的实现方式是用gzip格式,java本身有gzip的支持,.net没有相应的类库,我使用了开源项目sharpziplib来实现.net端的压缩功能。

经过试验,传输相同的字串,起码能够让长度减少三分之二,并且有效减低CPU的利用率。

代码如下:

1、C#端代码







public static string Compress(string uncompressedString)

{

byte[] byteData=System.Text.Encoding.UTF8.GetBytes(uncompressedString);

MemoryStream ms=new MemoryStream();

Stream s=new GZipOutputStream(ms);

s.Write(byteData,0,byteData.Length);

s.Close();

byte[] compressData=(byte[])ms.ToArray();

ms.Flush();

ms.Close();

return System.Convert.ToBase64String(compressData,0,compressData.Length);

}



public static string DeCompress(string compressedString)

{

// string uncompressedString=string.Empty;

StringBuilder sb=new StringBuilder(40960);

int totalLength=0;

byte[] byteInput=System.Convert.FromBase64String(compressedString);

byte[] writeData=new byte[4096];

Stream s=new GZipInputStream(new MemoryStream(byteInput));

while(true)

{

int size=s.Read(writeData,0,writeData.Length);

if(size>0)

{

totalLength+=size;

sb.Append(System.Text.Encoding.UTF8.GetString(writeData,0,size));

}

else

{

break;

}

}

s.Flush();

s.Close();

return sb.ToString();

}

2、Java端代码

public static String compress(String s) throws IOException{

ByteArrayInputStream input = new ByteArrayInputStream(s.getBytes("UTF-8"));

ByteArrayOutputStream output = new ByteArrayOutputStream(1024);

GZIPOutputStream gzout = new GZIPOutputStream(output);



byte[] buf=new byte[1024];

int number;





while ((number = input.read(buf)) != -1){

gzout.write(buf,0,number);

}



gzout.close();

input.close();



String result =new BASE64Encoder().encode(output.toByteArray());



output.close();



return result;

}



public static String decompress(String data) throws IOException{

ByteArrayOutputStream output = new ByteArrayOutputStream(1024);

ByteArrayInputStream input = new ByteArrayInputStream(new BASE64Decoder().decodeBuffer(data));

GZIPInputStream gzinpt = new GZIPInputStream(input);

byte[] buf = new byte[1024];

int number = 0;



while((number = gzinpt.read(buf)) != -1){

output.write(buf,0,number);

}



gzinpt.close();

input.close();



String result = new String(output.toString("UTF-8"));



output.close();



return result;



}

在web service服务器端加压,java客户端的调用解压,使用web service的性能得到了提升。

但觉得这样还是不能彻底的解决问题,下一步准备做的改进主要有两点,一是把服务器把返回的大数据量压缩成zip文件以attachment的格式返回给java客户端,另一个是在内部网络以tcp soap的方式进行调用,辅以多线程的技术,更有效地利用服务器的多CPU与并实现服务的分流,使web service不必依赖于IIS(当然啦,这些都需要WSE的支持)。
flyskywlh 2005-08-01
  • 打赏
  • 举报
回复
顶上去问!@


用压缩怎么压缩?

12,166

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 Web Services
社区管理员
  • Web Services社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧