StringBuilder 内存溢出?

阳光柚子 2008-01-08 02:10:33
我在进行数据库方面的采集,提取的数据保存在StringBuilder中,有3个StringBuilder,分别是Update(保存更新数据)、Add(保存添加数据)、Delete(保存删除数据)。
当数据量巨大的时候(比如我连续删除了4W条记录),那么Delete里就保存了4W条记录,此时如果我直接把Delete输入到文本保存,是可以的(大约60M)。但是由于我需要对格式进行整理,对字符串头和尾添加一些包装信息,所以我把Update、Add和Delete放入一个新的StringBuilder Result内,格式如下:
Result.AppendFormat("<头部信息>{0}{1}{2}</尾部信息>",Update,Add,Delete);
此时程序就会抛出异常,报告内存溢出。而且即使我单独对Delete进行格式化,Delete.AppendFormat("<头部信息>{0}</尾部信息>",Delete);也同样溢出,只有进行插入操作Delete.Insert(0,"<头部信息>"); Delete.Insert(Delete.Length-1,"</尾部信息>");才可以
请问这是怎么回事?如何解决,谢谢!
...全文
1400 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
阳光柚子 2008-01-14
  • 打赏
  • 举报
回复
不好意思,结贴晚了,感谢各位热心帮助,今天结贴
Eleve 2008-01-08
  • 打赏
  • 举报
回复
默认容量是 16,默认的最大容量是 Int32.MaxValue。 当实例值增大时,StringBuilder 可按存储字符的需要分配更多的内存,同时对容量进行相应的调整。分配的内存量是特定于实现的,而且如果所需内存量大于最大容量,会引发 ArgumentOutOfRangeException。
--------------------------------------------------------------------------------------------------
嗯,数据量大了,C#高级编程第4版上有对StringBuilder操作的较为详细的解释,可以去找来看看,好像是字符串和正则表达那一章吧
北京的雾霾天 2008-01-08
  • 打赏
  • 举报
回复
我测试在我机子上,StringBuilder的长度到了134217728就报错了。
honey52570 2008-01-08
  • 打赏
  • 举报
回复
太大了哇,别这么滥用嘛
北京的雾霾天 2008-01-08
  • 打赏
  • 举报
回复
默认容量是 16,默认的最大容量是 Int32.MaxValue。 当实例值增大时,StringBuilder 可按存储字符的需要分配更多的内存,同时对容量进行相应的调整。分配的内存量是特定于实现的,而且如果所需内存量大于最大容量,会引发 ArgumentOutOfRangeException。
Efcndi 2008-01-08
  • 打赏
  • 举报
回复
1、Delete.AppendFormat(" <头部信息> {0} </尾部信息> ", Delete);

这条语句需要2*Delete的空间,
最终的Delete在堆上,而作为参数的Delete在栈上,怀疑是栈溢出了。
检验“内存溢出”的类型是否是stackoverflowerror。

2、Delete.Insert(0," <头部信息> "); Delete.Insert(Delete.Length-1," </尾部信息> ");

这样做不需要栈空间。

北京的雾霾天 2008-01-08
  • 打赏
  • 举报
回复
字符串太长了!
大正他爹 2008-01-08
  • 打赏
  • 举报
回复
关注,
一般都是有错才会说这个错。
是不是数据量太大了。

110,545

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧