2017-10-17 36 views
0

有沒有辦法告訴Windows爲程序提供更多內存?我寧願這樣做,而不是重新編寫一個簡單的程序,否則它運行良好。我們可以爲獲取OutOfMemoryException的程序分配更多內存

我們有一個C#程序,每15分鐘運行一次,並將新傳入文件與前一個文件進行比較。新舊文件都是「|」分離並讀入內存。我們還沒有嘗試優化,只是將所有內容都讀入字典並進行直接比較。

我們收到此錯誤,

Message: Exception of type 'System.OutOfMemoryException' was thrown. at 
System.String.SplitInternal(Char[] separator, Int32 count, 
          StringSplitOptions options) 
at System.String.Split(Char[] separator) 

每個文件都有約1000線,每條線都有base64編碼的大圖像作爲豎線分隔的領域之一。每行可以是500K-700K,因此每個文件的總大小約爲600MB。也許偶爾會超過1MB。

我們估計該程序使用1.5GB左右的RAM。我想給它更多的RAM而不是試圖優化代碼。或者,如果整個程序運行內存不足,或者某個特定的巨大行可能會導致SplitInternal引發此異常,將會很好。

Windows Server 2012R2。

編輯:有問題的代碼行只是「string [] data = info.Split('|');」在一個循環內。在發現這個異常之後,程序繼續並處理很多其他行。

不反對重寫它,但如果有更簡單的方法,我想先嚐試一下。我們確認它是用「Prefer 32 bit」複選框編譯的,所以首先我們將嘗試取消選中並查看會發生什麼。畢竟,2GB現在在服務器上並不是很多...

+3

你有內存泄漏。添加更多的內存不是解決方案,而是檢查你的應用程序代碼中的哪個部分泄漏了它 – Rahul

+0

你應該真的將代碼更改爲內存中不需要1.5 GB字符串的代碼。除了OOM之外,異常通常意味着與物理內存不同的東西,例如32位進程中的地址或碎片,或者...... – Console

+0

'或者,如果程序整體運行內存不足或一個特定的巨大行可能會導致SplitInternal拋出此異常.'另一個值得了解的好事可能是您正在運行的代碼... – mjwills

回答

1

應用程序項目是否設置了「首選32位」?

What is the purpose of the "Prefer 32-bit" setting in Visual Studio 2012 and how does it actually work?

如果是這樣,禁用它,你現在應該能夠使用大多數可用的RAM,假設有其他地方沒有問題。

+0

是的,這是設置。將嘗試沒有看到會發生什麼。謝謝! – royappa

+0

我們的合作伙伴發現有時圖像大小可達4MB,同時將圖像大小減小到10K ..所以目前還不清楚這是否會奏效,但是,我們絕對想要使用64位來處理所有事情,所以這是最有用的答案。謝謝 - 每個人! – royappa

+0

@royappa你可能想看看這樣的一些代碼,如https://stackoverflow.com/a/6655492/310988,當你讀取流時將流切分成多個字符串。這將節省您不得不閱讀完整字符串,然後從該大字符串中創建較小的字符串。 – AndyJ

相關問題