Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何解决stringBuilder碎片?_C#_.net_Stringbuilder_Memory Fragmentation - Fatal编程技术网

C# 如何解决stringBuilder碎片?

C# 如何解决stringBuilder碎片?,c#,.net,stringbuilder,memory-fragmentation,C#,.net,Stringbuilder,Memory Fragmentation,在我的StringBuilder中,我得到了一个很好的SystemOutOfMemory异常。这不是因为缺少ram,所以我相信这是内存碎片 我有大约200个StringBuiler对象。所有这些都会定期重复使用(使用strBldr.clear()。这似乎导致我的系统将内存分割得非常糟糕。我怎样才能解决这个问题 谢谢:) 编辑: 以下是一些数据: 输入和stringBuilder的最大记录大小:4 146 698 Avarage重新启动stringBuilders/秒:>120(可能>>120)

在我的StringBuilder中,我得到了一个很好的SystemOutOfMemory异常。这不是因为缺少ram,所以我相信这是内存碎片

我有大约200个StringBuiler对象。所有这些都会定期重复使用(使用strBldr.clear()。这似乎导致我的系统将内存分割得非常糟糕。我怎样才能解决这个问题

谢谢:)

编辑:

以下是一些数据:

输入和stringBuilder的最大记录大小:4 146 698

Avarage重新启动stringBuilders/秒:>120(可能>>120)

输入长度@第一个错误:16 972(字符串)

StringBuilder长度@第一个错误:16

创建新stringBuilder的次数@first error:~32500


总ram使用率@first error 637 448K

您不应该重复使用类似的
StringBuilder
,只要根据需要创建一个新的即可

StringBuilder
上调用
Clear
时,它不会释放所使用的所有内存,只会将所使用的大小重置为零。它仍将具有相同的大缓冲区,重复使用
StringBuilder
只意味着缓冲区将与需要的一样大,并且永远不会收缩


另外,保留
StringBuilder
对象以供重用意味着它们可以处理垃圾收集并转移到下一代堆。这些数据收集的频率较低,因此它们更容易受到内存碎片的影响。

我同意,很可能不是内存不足,而是内存碎片

您必须熟悉碎片和大型对象堆(LOH)

你没有提供任何细节,所以我只能给出一些非常广泛的建议:

  • 尝试估计字符串的大小,并使用新SB的容量参数
  • 将这些大小(实际上)四舍五入到某个数字的倍数。这促进了重复使用
  • 只有当您希望新内容的大小与旧内容的大小几乎相同时,才使用Clear(),因为它的增长会让您丧命

编辑

输入和stringBuilder的最大记录大小:4 146 698

  • 确保不需要更大尺寸的中间体,然后
  • 创建所有StringBuilder,如
    sb1=newStringBuilder(4200000)
  • 不要试图重复使用它们(太多/根本不用)
  • 不要把它们放得太久

我最后做的是迁移到x64。这解决了我的问题


我有可能精确地分配了x86的全部内存空间,尽管我没有全部使用。迁移到x64肯定会解决这个问题。

您如何确切地知道这不是由于缺少RAM造成的?您已经完成了什么类型的测试/评测/调试?我在一台有16 GB ram的机器上运行,程序的最大时钟为700 Mb(任务管理器)。因此,我得出结论,这不是缺乏内存。是的,这是总内存。超出可分配给单个
StringBuilder
实例的内存量会怎么样?查看MSDN:“当实例的值被放大时,StringBuilder可以根据需要分配更多内存来存储字符,并相应地调整容量。分配的内存量是特定于实现的,如果所需的内存量大于最大容量,则会抛出ArgumentOutOfRangeException或OutOfMemoryException。另请参见:,@Cody,您上面的两条注释将是一个很好的答案,您不认为吗?:)当你说:“不要让它们停留太久”时,你的意思是我应该将stringbuilder设置为null吗?同样,很难给出如此广泛的建议。为局部变量设置空值是没有意义的,为字段设置空值可能有用。只要保持他们的范围尽可能短。