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

问题描述

| 我正在使用C#应用程序,并且此应用程序正面临内存不足,因为许多对象正在大对象堆中获取内存分配。 我的C#应用​​程序必须处理许多大文件(作为字符串对象),因此该字符串类型对象的内存一次又一次地从大对象堆中分配(从而导致LOH碎片化)。 由于字符串是一个不变的对象,因此LOH中的新内存始终分配给该对象。 我的问题是,有没有办法,我可以在大对象堆中预分配一些内存,并始终将相同的内存分配给字符串对象。 这是更详细的内容: 如前所述,我正在处理这些大文件。要进行处理,我必须将其转换为字符串。即使我使用stringBuilder,也不会有太大帮助,因为一旦我将其转换为String,便会在LOH中为此分配一个单独的内存。 因此,我希望在内存中分配一堆,比如说100 KB,每当我读取一个文件并将其转换为字符串时,就会分配这100 KB。     

解决方法

        您应该使用“ 0”对象来处理字符串,因为它是可变的字符串,并提供了许多使用它的方法。 您说的是每个字符串都一次又一次地创建。如果由于某种原因必须使用字符串,只需对它们进行“ 1”字处理-它们将被存储一次,而不会再次添加到内存堆中     ,        您是否考虑过使用内存映射文件? http://msdn.microsoft.com/en-us/library/dd997372.aspx 我不知道您对字符串的处理方式,但是有理由不使用流吗?     ,        尚不清楚您要对字符串执行哪种操作,最好的方法是估计最终结果。使用悲观(大)估计值,并可能增加余量。 然后使用Capacity参数创建一个StringBuilder:
var buffer = new StringBuilder(LargestExpectedSize);
这本质上是在LOH上的预分配。避免(自动)生长StringBuilders或
List<>
s