2009-10-22 99 views
2

當執行一個導入過程,其中創建了很多對象時,我在System.OutOfMemoryException上掙扎。WCF Web服務上的System.OutOfMemoryException

效果是,ASPNET_WP.EXE最高可達1.4 GB,並且會引發異常。

我已經試圖實現IDisposable並在那個負責任的函數中調用垃圾收集器(GC.Collect()),但沒有任何效果。

服務器是具有4 GB RAM的QuadCore(C2Q)。即使有更多的內存不足1,4 GB,當aspnet_wp.exe達到1.4 GB時,總會拋出異常。

如何避免這些OutOfMemory問題?

確切異常消息是:

System.OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown. 
at 
OpenAccessRuntime.DataObjects.PersistenceManagerFactoryBase. 
CreatePersistenceMangerImp(StorageManger sm) 
at 
.... 
+0

你能提供一些關於你在做什麼的細節。您可能能夠重構算法或分塊操作以避免這種情況。 – 2009-10-22 04:42:31

回答

1

你可以做你在進口件,而不是快速創建大量的對象和他們的處置。

您可能想要更多地解釋發生了什麼,以及您如何處理導入。

例如,你可以完全處理和保存每個對象,然後做另一個對象嗎?

您可能想要獲取內存分析器。這裏有一些開源的c#分析器: http://csharp-source.net/open-source/profilers

我會看兩件事情。

  1. 你可以改變你的 算法來防止這種情況。
  2. 獲取更多信息,爲什麼 這種情況正在發生。
+0

在從csv文件到數據庫的實際導入中沒有問題。問題是將csv文件中的一行中的新記錄添加到不同的表中,它們在一個循環中幾乎是30個函數調用。但是,內存或代碼有哪些可能的問題? – Ravi 2009-10-22 10:48:02

+0

如果你有一個複雜的導入,你可能想要做的就是看看其中一個電話是否是罪魁禍首,通過發表評論,然後在發現之前不斷評論不同的電話。我期望它是你的代碼,因爲它聽起來像你的程序變得非常大。你有沒有想過使用LINQ,所以你只能一次讀入並處理一行? – 2009-10-22 12:28:41

0

請記住,如果您在asp.net中運行,則無法訪問所有內存,它只會允許您使用標準配置的2gig。 也許你應該把它用於Windows服務或控制檯應用程序。

請參見此處:「事實:在標準設置中,您的工作進程始終具有2GB可用虛擬內存(無論機器中是否有1,2或4GB物理內存)。」

http://jesperen.wordpress.com/2007/05/23/understanding-aspnet-memory/

+0

這真的可能是一個記憶問題?因爲它只有400 ++的記錄?其他人在100,000 ++記錄中有問題 – Ravi 2009-10-22 10:49:02

2

一個字:self-hosting

當涉及到內存處理時,IIS有限制和瑕疵,如果您的WCF服務真的必須在服務器上使用超過1.4 GB的內存,那麼您需要自己託管該WCF服務,在控制檯應用程序, NT服務,一個Winforms應用程序 - 無論您選擇何種方式。

快速的問題,但:你的服務器是如何去處理,如果處理每個請求將佔用1.4 GB的內存10個同時請求....

你們是不是要回傳文件什麼的?在這種情況下,您應該檢出WCF streaming,這可以大大減少服務器上所需的緩衝區大小。

Marc

+0

很好的回覆......問題在於他們對於一條記錄的請求超過了10個......而當內存達到1.4 GB時,它與系統內存異常崩潰.. – Ravi 2009-10-22 10:50:38

+0

好的,所以這不是一個吞噬1.4 GB的單一請求 - 這是我似乎從您的問題中瞭解到的...... 解決方案仍然是相同的:自託管。 – 2009-10-22 13:11:11