如何在大字符串中运行多个正则表达式(以查找匹配项)而不会导致LOH碎片化?
使用.NET Framework 4.0,因此我正在使用StringBuilder,因此它不在LOH中,但是一旦我需要对其运行RegEx,我就必须调用StringBuilder.ToString(),这意味着它将位于LOH中。
有没有解决此问题的解决方案?几乎不可能有一个长时间运行的应用程序来处理像这样的大字符串和RegEx。
解决此问题的一个想法:
考虑到这个问题,我认为我找到了一个肮脏的解决方案。
在给定的时间内,我只有5个字符串,这5个字符串(大于85KB)将传递给RegEx.Match。
由于碎片化发生在新对象无法适合LOH中的空白空间时,这应该解决问题。
将所有字符串都填充到最大接受大小,比如1024KB(我可能需要使用StringBuider进行此操作)
通过这样做,所有新字符串都将适合于先前字符串已经超出范围的已清空内存
不会有任何碎片化,因为对象大小始终相同,因此在给定时间内只分配了1024 * 5个空间,并且这些空间在LOH中将被这些字符串共享。
我想这种设计的最大问题是,如果其他大型对象将此位置分配在LOH中,这将导致应用程序分配许多1024 KB字符串,可能会产生更严重的碎片化。fixed语句可能有帮助,但是如何将固定的字符串发送到RegEx而不实际创建不在固定内存地址中的新字符串呢?
对于这个理论有什么想法?(不幸的是,我无法轻松地复制问题,通常尝试使用内存分析器观察变化,也不确定我可以为此编写什么样的隔离测试用例)
使用.NET Framework 4.0,因此我正在使用StringBuilder,因此它不在LOH中,但是一旦我需要对其运行RegEx,我就必须调用StringBuilder.ToString(),这意味着它将位于LOH中。
有没有解决此问题的解决方案?几乎不可能有一个长时间运行的应用程序来处理像这样的大字符串和RegEx。
解决此问题的一个想法:
考虑到这个问题,我认为我找到了一个肮脏的解决方案。
在给定的时间内,我只有5个字符串,这5个字符串(大于85KB)将传递给RegEx.Match。
由于碎片化发生在新对象无法适合LOH中的空白空间时,这应该解决问题。
将所有字符串都填充到最大接受大小,比如1024KB(我可能需要使用StringBuider进行此操作)
通过这样做,所有新字符串都将适合于先前字符串已经超出范围的已清空内存
不会有任何碎片化,因为对象大小始终相同,因此在给定时间内只分配了1024 * 5个空间,并且这些空间在LOH中将被这些字符串共享。
我想这种设计的最大问题是,如果其他大型对象将此位置分配在LOH中,这将导致应用程序分配许多1024 KB字符串,可能会产生更严重的碎片化。fixed语句可能有帮助,但是如何将固定的字符串发送到RegEx而不实际创建不在固定内存地址中的新字符串呢?
对于这个理论有什么想法?(不幸的是,我无法轻松地复制问题,通常尝试使用内存分析器观察变化,也不确定我可以为此编写什么样的隔离测试用例)