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

时间:2009-05-20 00:25:11

标签: asp.net sql-server wcf ado.net 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服务器内存中,而是直接流式传输到客户端?

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

任何建议,最佳做法或提示都将不胜感激。

2 个答案:

答案 0 :(得分:5)

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

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

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

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

答案 1 :(得分:0)

最佳做法是:a)不要返回太多数据,b)使用WCF而不是四年前的技术(ASMX Web服务)。