.net 如何避免字符串导致碎片化为LOH

.net 如何避免字符串导致碎片化为LOH,.net,string,large-object-heap,memory-fragmentation,.net,String,Large Object Heap,Memory Fragmentation,我的应用程序从进入大对象堆的文本文件中读取大量数据,最终导致碎片问题。有没有其他的设计方法可以帮助避免这些问题?我知道StringBuilder,但从文本文件中读取似乎仍然会在LOH中创建大字符串 如果您不想更改对ReadAllLines的调用,那么当字符串足够大时,就无法避免分配给LOH(除了克隆.Net github repo、更改分配策略并重新编译它)。任何其他解决方案都可以从文件中读取较小的字符串,或者将文件作为字节读取到自己的缓冲区中,然后在缓冲区中自行管理字节的分配和排列,这可能通过

我的应用程序从进入大对象堆的文本文件中读取大量数据,最终导致碎片问题。有没有其他的设计方法可以帮助避免这些问题?我知道StringBuilder,但从文本文件中读取似乎仍然会在LOH中创建大字符串

如果您不想更改对
ReadAllLines
的调用,那么当字符串足够大时,就无法避免分配给LOH(除了克隆.Net github repo、更改分配策略并重新编译它)。任何其他解决方案都可以从文件中读取较小的字符串,或者将文件作为字节读取到自己的缓冲区中,然后在缓冲区中自行管理字节的分配和排列,这可能通过创建自己的字符串类来增强(因为System.string总是复制到自己的缓冲区中)

但是,您现在可以选择.Net>=4.5.1:LOH压缩。要手动执行此操作,请执行以下操作:

GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce;
GC.Collect();  

LOH仅在85000字节时启动。。。我猜你在把整个文件读入字符串?你只需要把它分块读。你是如何从文件中读取的?如果这就是问题所在,那么您需要以小块的方式访问文件,而不是像
ReadAllLines
这样的方式。我通过ReadLine执行的大部分操作都是通过ReadAllLines执行的,尽管很少有地方也通过ReadAllLines执行。当通过ReadLine执行时,我仍然需要将所有这些行合并为一行,这是使用StringBuilder完成的,然后它将在LOH中结束。如果您不能编写更智能的代码,那么只需为您的应用程序指定一个64位操作系统,没有理由不期望出现这种情况。@HansPassant我可以拥有某种类型的内存缓冲区,并以某种方式让这些分配从该缓冲区而不是整个内存中进行吗?我相信这有助于改善碎片问题,但一旦使用LOH,还存在其他问题:)例如GC工作更慢,消耗更多CPU并降低处理吞吐量。由于
asp.net core 3.x
,此压缩是自动完成的,但我怀疑其他提到的问题是否仍然会影响性能。