2009-06-23 68 views
1

我有C#客戶端應用程序調用WCF調用的Windows webservice調用Sql過程和此過程給出輸出大約130萬條記錄,然後C#客戶端應用程序將它們保存在內存中並逐個執行所有驗證 我收到錯誤:System.OutOfMemoryException

System.Exception: An exception has occurred when recalculating the balances, the transaction will be rolled back.


System.OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown. 
    at System.Collections.Generic.List`1.set_Capacity(Int32 value) 
    at System.Collections.Generic.List`1.EnsureCapacity(Int32 min) 
    at PitToPort.DataLayer.StockpileData.StockpileProfile.CreateStockpileProfileQualityFromAllPartialMovements() 
    at PitToPort.DataLayer.StockpileRecalc.Recalc.CreateSP_FOFO_FOLO_NegTransaction(Int32 modelID, StockpileProfile currentStockpileProfile, TransactionsRow drTransactions) 
    at PitToPort.DataLayer.StockpileRecalc.Recalc.CreateBalanceFOLO_FOFO_TWAA(TransactionsRow[] drTransactionsRows, Int32 modelID, StockpileProfileList stockpileProfileList) 
    at PitToPort.DataLayer.StockpileRecalc.Recalc.CreateBalances() 
    at QMastor.PitToPort.StockpileRecalculationBL.RecalcService.CreateBalances() 

可能是什麼造成這個錯誤,如何糾正呢?我已經檢查過程中,它運行良好

回答

4

看起來你似乎正在嘗試初始化某種類型的通用列表,並在這樣做,內存不足。

該過程本身可能會成功,但也可能會返回許多行。

在初始化List對象之前,您可能需要遍歷代碼並檢查查詢的結果。

沒有更多的細節,恐怕我不能幫助調試更多。

編輯:

您將需要批量處理存儲過程的結果。你仍然可以使用SqlDataReader,但是我建議使用一個最大容量爲1000的相對較小的List來創建一個List,然後從SqlDataReader中讀取,直到你填充List ...然後清除列表並重新開始讀取:

SqlDataReader dr = cmd.ExecuteReader(); // where cmd is a SqlCommand 

List<SomeType> items = new List<SomeType>(1000); 

while(dr.Read()) { 
    // read the values for the row 
    SomeType obj = new SomeType(dr["id"], dr["value"], ...); 

    // add the object to the list 
    items.Add(obj); 

    // when the list is full, process it, and create a new one. 
    if(items.Count >= 1000) { 
    Process(items); 
    items = new List<SomeType>(1000); 
    } 
} 
+0

是的,proc給出了約130萬條記錄的結果 – rmdussa 2009-06-23 06:19:49

0

也可讀取這些article

「Out Of Memory」 Does Not Refer to Physical Memory

2

只是一個問題 - 你必須加載所有的130萬行到內存?即使每行都是1KB,這也是很多數據。難怪你的應用程序正在努力執行。

是否有可能重構你的應用程序來加載數據的一個子集?