相关疑难解决方法(0)

C#Stringbuilder OutOfMemoryException

我写了以下功能

public void TestSB()
{
  string str = "The quick brown fox jumps over the lazy dog.";
  StringBuilder sb = new StringBuilder();
  int j = 0;
  int len = 0;

  try
  {
     for (int i = 0; i < (10000000 * 2); i++)
     {
        j = i;
        len = sb.Length;
        sb.Append(str);
     }

    Console.WriteLine("Success ::" + sb.Length.ToString());
  }
  catch (Exception ex)
  {
      Console.WriteLine(
          ex.Message + " :: " + j.ToString() + " :: " + len.ToString());
  }
}
Run Code Online (Sandbox Code Playgroud)

现在我想,这个stringbuilder有能力超过20亿字符(准确地说是2,147,483,647).

但是当我运行上面的函数时,它只是在达到大约8亿的容量时给出了"System.OutOfMemoryException".而且,我在具有相同内存和相似负载量的不同PC上看到了截然不同的结果.

任何人都可以提供或解释我的原因.

c# stringbuilder out-of-memory

18
推荐指数
1
解决办法
2万
查看次数

有趣的OutOfMemoryException与StringBuilder

我需要在循环中连续构建大字符串并将它们保存到数据库中,目前偶尔会产生一个OutOfMemoryException.

这里基本上是基于一些数据使用XmlWriterwith 创建一个字符串StringBuilder.然后我从外部库调用一个方法,将该xml字符串转换为其他字符串.之后,转换后的字符串将保存到数据库中.对于不同的数据,这整个过程在一个循环中重复完成大约100次.

字符串本身不是太大(每个低于500kByte),并且在此循环期间进程内存不会增加.但是,偶尔我会得到一个OutOfMemeoryExcpetion内部StringBuilder.Append.有趣的是,此异常不会导致崩溃.我可以捕获该异常并继续循环.

这里发生了什么?为什么我会得到一个OutOfMemoryException尽管系统中仍有足够的可用内存?这是一些GC堆问题吗?

鉴于我无法绕过转换所有这些字符串,我能做些什么来使这项工作可靠?我应该强制GC收集吗?应该Thread.Sleep进入循环?我应该停止使用StringBuilder吗?应该只是在面对时重试OutOfMemoryException

c# memory stringbuilder garbage-collection

11
推荐指数
1
解决办法
2万
查看次数