2009-05-20 43 views
1

1)ClientApp對ASP.Net 2.0進行異步調用WebService 2)Web服務調用SQL Server 2005存儲過程 3)存儲過程返回數據輸出,150MB表Web服務內存異常填充ADO.Net數據集

內存不足內存異常在嘗試爲新行分配更多內存時由DataAdapter.Fill(...)拋出。

IIS應用程序池沒有任何最大內存限制。

是否在IIS級別的其他地方設置了最大內存利用率上限? 作爲DataSet讀入內存時,150MB的數據庫表是否會佔用更多的空間? 有沒有一個場景(可能與WCF)的過程的結果永遠不必駐留在Web服務器的內存,但會直接流到客戶端?

我不希望將請求拆分成更小的數據集,因爲客戶端異步地請求它們。收集所有部分也必須異步發生,每個客戶端必須爲每個調用實現異步收集。

任何建議,最佳做法或技巧,將不勝感激。

+0

幾個問題。 1)是否託管在32位版本的Windows Server上? 2)應用程序池工作進程在崩潰時有多大? – Jeff 2009-05-20 00:32:49

回答

5

是的,使用DataSet比實際數據使用更多的內存。有多少難以量化,但StackOverflow上的this問題建議超過原始數據大小的4倍。我們假設這是正確的。 150MB的數據乘以4 = 600MB的內存。當ASP.NET應用程序使用大約800MB的RAM時,它們將開始拋出OutOfMemoryExceptions。我不確定該限制與應用程序池內存限制相同。您是否在boot.ini中嘗試了/ 3GB開關? (有關說明見this article

另外請注意,如果你是序列化DataSet中,串行器可分配巨大的緩衝區進行序列化(高達10倍的原始尺寸,見this article。你表明,當你閱讀出現問題所以這可能不是你的錯誤的原因(但它可能是如果你解決了內存不足的錯誤,並嘗試通過電線發送數據)。

我對數據集的經驗是,他們可能看起來像一個好主意,但你很快就會遇到問題

另一個(可能更好)的解決方案是使用DataReader和讀取o ne row一次。返回成批的行(即對數據使用某種分頁)並試驗每批的大小以找到性能和內存使用之間的最佳位置。 WCF流式傳輸可能會訣竅,但您需要正確配置WCF以允許它在一次調用中返回如此大量的數據。

0

最佳實踐是a)不要返回太多的數據,b)使用WCF而不是四年前的技術(ASMX Web服務)。

+0

WCF如何處理ADO.Net DataSet.Fill()異常?內存不足在DataSet完全加載到Web服務器內存之前發生。它甚至沒有開始作爲Web服務響應序列化爲傳輸。 WCF可以配置爲直接從SQL將數據流式傳輸到客戶端,而不必將其全部加載到DataSet中的內存中? – Tion 2009-05-20 04:36:57