我的应用程序从进入大对象堆的文本文件中读取大量数据,最终导致碎片问题。是否有任何替代设计方法可以帮助不将这些方法提交给LOH?我知道StringBuilder,但似乎从文本文件中读取仍然在内部创建大型字符串到LOH。
答案 0 :(得分:1)
如果你不想改变对ReadAllLines
的调用,那么当字符串足够大时(克隆.Net github repo,改变分配策略,并且没有办法避免分配给LOH)重新编译它)。任何其他解决方案都会看到从文件中读取较小的字符串,或者将文件作为字节读入您自己的缓冲区,然后您可以自己管理字节的分配和排列,可能通过创建自己的字符串类来增强(因为System.String总是复制到自己的缓冲区中。)
但是,您现在可以选择.Net> = 4.5.1:LOH压缩。要手动执行此操作,请执行以下操作:
GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce;
GC.Collect();