3

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

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

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

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

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

4

3 回答 3

3

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

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

于 2011-06-11T13:10:45.560 回答
1

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

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

于 2011-06-11T13:11:11.543 回答
1

目前尚不清楚您想对琴弦进行什么样的操作,最好的方法是对最终结果的估计。使用悲观(大)估计,并可能增加一个边际。

然后使用容量参数创建一个 StringBuilder:

var buffer = new StringBuilder(LargestExpectedSize);

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

于 2011-06-11T13:58:05.423 回答