2011-06-11 114 views
3

我正在處理C#應用程序,並且此應用程序面臨內存緊縮,因爲許多對象都在大對象堆中獲取內存分配。我的C#應用​​程序必須處理許多大文件(作爲字符串對象),因此此字符串類型對象的內存從大對象堆中一次又一次分配(因此導致LOH碎片)。在大對象堆內存中預分配一些內存

由於字符串是一個不可變對象,因此LOH中的新內存始終分配給此對象。 我的問題是,有沒有辦法,我可以在大對象堆中預先分配一些內存,並始終將相同的內存分配給字符串對象。

這裏是更詳細的內容: 正如我所提到的,我正在處理這些大文件。爲了處理,我必須將其轉換爲字符串。即使我使用了stringBuilder,也沒有什麼幫助,因爲只要我把它轉換成字符串,就可以在LOH中分配一個單獨的內存。

所以,我期待着在內存中分配一堆讓我們說100 KB的文件,並且每當我讀取一個新文件並將其轉換爲字符串時,都會分配這100 KB。

+2

考慮使用'StringBuilder',它基本上是一個可變字符串。 – 2011-06-11 13:06:36

+5

你爲什麼一遍又一遍地分配相同的字符串?如果您創建了一次,然後將其傳遞給所有消費者。 – Andrei 2011-06-11 13:06:37

+2

爲什麼你認爲LOH碎片是你的問題? – svick 2011-06-11 13:12:53

回答

3

您應該使用StringBuilder對象來處理字符串,因爲它是一個可變字符串,並提供許多方法來處理它。

你在說每個字符串都是一次又一次創建的。如果由於某種原因,你必須使用字符串,只是Intern他們 - 他們將存儲一次,並不會再添加到內存堆

+2

實習只會工作它是相同字符串的許多倍(來自文件)。不太可能。 – 2011-06-11 13:54:46

+0

我剛纔說了所有的變種 – VMAtm 2011-06-11 16:04:12

1

目前還不清楚你想要對絃樂做什麼樣的動作,你最好的拍攝是對最終結果的估計。使用悲觀(較大)的估計值,也許會增加一個保證金。

然後創建一個StringBuilder與容量參數:

var buffer = new StringBuilder(LargestExpectedSize); 

這實質上是對LOH預分配。避免(自動)增長StringBuilders或List<> s