在大对象堆内存中预分配一些内存

时间:2011-06-11 13:04:03

标签: c# .net memory-management fragmentation large-object-heap

我正在开发一个C#应用程序,这个应用程序面临内存紧缩,因为许多对象正在大对象堆中获取内存。

我的C#应用​​程序必须处理许多大文件(作为字符串对象),因此该字符串类型对象的内存将从Large对象堆中反复分配(从而导致LOH碎片)。

由于string是一个不可变对象,因此LOH中的新内存始终分配给该对象。 我的问题是,有没有办法,我可以在大对象堆中预先分配一些内存,并始终为字符串对象分配相同的内存。

以下是更详细的内容: 正如我所提到的,我正在处理这些大文件。要进行处理,我必须将其转换为字符串。即使我使用stringBuilder,它也没有多大帮助,因为只要我将它转换为字符串,就会在LOH中为此获取分配一个单独的内存。

所以,我期待在内存中分配一堆让我们说100 KB的内容,每当我读取一个新文件并将其转换为字符串时,这些100 KB就会被分配。

3 个答案:

答案 0 :(得分:3)

您应该使用StringBuilder对象来处理字符串,因为它是一个可变字符串并提供了许多方法来处理它。

你说的是每一个字符串都是一次又一次地创建的。如果出于某种原因,你必须使用字符串,只需要Intern - 它们将存储一次,并且不会再次添加到内存堆中

答案 1 :(得分:1)

你考虑过使用内存映射文件吗? http://msdn.microsoft.com/en-us/library/dd997372.aspx

我不知道你对字符串做了什么,但是有理由不使用流吗?

答案 2 :(得分:1)

目前还不清楚你想对琴弦做什么样的动作,你最好的镜头是对最终结果的估计。使用悲观(大)估计并可能增加一个余量。

然后使用capacity参数:

创建一个StringBuilder
var buffer = new StringBuilder(LargestExpectedSize);

这基本上是对LOH的预分配。避免(自动)增长StringBuilders或List<> s