填充ADO.Net DataSet时Web服务内存不足异常

Tio*_*ion 1 sql-server asp.net ado.net wcf iis-6

1)ClientApp对ASP.Net 2.0 WebService进行异步调用2)Web服务调用SQL Server 2005存储过程3)存储过程返回数据输出,150MB表

内存不足DataAdapter.Fill(...)在尝试为新行分配更多内存时抛出异常.

IIS应用程序池没有任何Max Memory限制.

是否在IIS级别的其他位置设置了最大内存利用率上限?当作为DataSet读入内存时,150MB db表是否会占用更多空间?是否存在一个场景(可能是WCF),其中过程的结果永远不会驻留在Web服务器内存中,而是直接流式传输到客户端?

我不希望将请求拆分为较小的数据集,因为客户端异步请求它们.收集所有部分也必须异步发生,并且每个客户端必须为每个调用实现异步收集.

任何建议,最佳实践或提示将不胜感激.

小智 5

是的,使用DataSets比实际数据使用更多的内存.多少难以量化,但StackOverflow上的这个问题表明原始数据大小超过原始数据的4倍.我们假设这是正确的.150MB的数据乘以4 = 600MB的内存.当ASP.NET应用程序使用大约800MB的RAM时,它们将开始抛出OutOfMemoryExceptions.我不确定该限制与应用程序池内存限制的相同之处.你在boot.ini中尝试过/ 3GB开关吗?(有关说明,请参阅此文章)

另请注意,如果要序列化DataSet,序列化程序可能会为序列化分配大量缓冲区(最多为原始大小的10倍,请参阅此文章.您指出在读取数据时会出现问题,因此这可能不是原因您的错误(但可能是您解决了内存不足错误并尝试通过线路发送数据).

我对DataSet的经验是,它们最初看起来似乎是一个好主意,但你很快就会遇到问题.

另一个(可能更好的)解决方案是使用DataReader并一次读取一行.返回批量行(即对数据使用某种分页)并尝试每批的大小以找到性能和内存使用之间的最佳点.WCF流可能会起到作用,但您需要正确配置WCF以允许它在一次调用中返回如此大量的数据.