导出合同时报错Exception of type 'System.OutOfMemoryException' was thrown

卖报de小行家 2018-01-04 10:40:05
遇到一个问题,希望大神们帮帮忙@sp123

因为合同非标准化,所以只有一行一行的生成,但是一周左右就会出现较大的合同导不出的情况,问题出现后,一天左右后又能导出了,好像是系统释放了内存,报错时是执行到docWW.Save(dir);报错Exception of type 'System.OutOfMemoryException' was thrown,部分代码如下:


StringBuilder _HTML = new StringBuilder();
_HTML.Append("<html xmlns: v =\"urn:schemas-microsoft-com:vml\"");
_HTML.Append("xmlns:o =\"urn:schemas-microsoft-com:office:office\"");
_HTML.Append("xmlns:w =\"urn:schemas-microsoft-com:office:word\"");
_HTML.Append(" xmlns:m =\"http://schemas.microsoft.com/office/2004/12/omml\"");
_HTML.Append("xmlns =\"http://www.w3.org/TR/REC-html40\">");
_HTML.Append("<head><meta http-equiv=Content-Type content=\"text/html; charset=gb2312\"><meta name=Generator content=\"Microsoft Word 15 (filtered)\">");
//_HTML.Append("<style> ");
//_HTML.Append(" .table-ww table{border-right:1px solid #F00;border-bottom:1px solid #F00}");
//_HTML.Append(" .table-ww table td{border-left:1px solid #F00;border-top:1px solid #F00}");
//_HTML.Append(" </style> ");
_HTML.Append("</head><body>");

。。。。。。。。。。。。。。(省略N个循环)




_HTML.Append("</body></html><br>");

#region 保存DOC文件
string dir = Server.MapPath("/template/MAC/" + fileName);
InitLog(dir.ToString() + "----DocumentBuilder START SAVE");
Document docWW = new Document();
DocumentBuilder builder = new DocumentBuilder(docWW);
//插入合同明细
builder.InsertHtml(_HTML.ToString());
//创建页脚
builder.MoveToHeaderFooter(HeaderFooterType.FooterPrimary);
builder.Write(_footer);
docWW.Save(dir);

docWW = null;

GC.Collect();

InitLog(dir.ToString() + "----DocumentBuilder SAVE OK");
#endregion
_HTML.Clear();
...全文
1781 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
E次奥 2018-01-09
  • 打赏
  • 举报
回复
先生成文件到硬盘,然后给硬盘中分批次写入各个数据;你这个一下把所有数据都弄到内存,内存不足了。。。
xinbada1985 2018-01-05
  • 打赏
  • 举报
回复
问题点在于内存存放字符串太多,导致内存溢出了,解决问题有两种 1.第一种把程序从32位系统调整到64位系统,升级内存 2.就是你程序本身就不应该这么写,不应该把所有字符串拼接完后在创建文件往里面写,更合理的是先创建文件, 然后一行行往文件里面写,就不会导致内存溢出了。
卖报de小行家 2018-01-05
  • 打赏
  • 举报
回复
引用 2 楼 qq_25095899 的回复:
不必每次都重新StringBuilder 写你的html 可以做成静态化,直接填充你的htmll里的content
就算这样也是会报内存溢出的,大文件本地调试时也会报错
xinbada1985 2018-01-05
  • 打赏
  • 举报
回复
引用 5 楼 Lzhen1024 的回复:
[quote=引用 4 楼 xinbada1985 的回复:] 问题点在于内存存放字符串太多,导致内存溢出了,解决问题有两种 1.第一种把程序从32位系统调整到64位系统,升级内存 2.就是你程序本身就不应该这么写,不应该把所有字符串拼接完后在创建文件往里面写,更合理的是先创建文件, 然后一行行往文件里面写,就不会导致内存溢出了。
1,服务器本来就是64位系统,8G内存,应该不是什么内存碎片的问题,是公司自己内部的系统,感觉配置已经可以了 2,不太明白,DocumentBuilder 能分批次写吗,麻烦详细一点,谢谢。[/quote] 1.首先我说的64位系统不是电脑配置,而是开发的程序是64位的,因为32位的开发程序内存使用上限是2G,超过2个G就会内存溢出。 2. 当然可以分段是存储啊!html嵌入WORD的方式大部分都会内存溢出!这样的列子百度上有很多
卖报de小行家 2018-01-05
  • 打赏
  • 举报
回复
引用 4 楼 xinbada1985 的回复:
问题点在于内存存放字符串太多,导致内存溢出了,解决问题有两种 1.第一种把程序从32位系统调整到64位系统,升级内存 2.就是你程序本身就不应该这么写,不应该把所有字符串拼接完后在创建文件往里面写,更合理的是先创建文件, 然后一行行往文件里面写,就不会导致内存溢出了。
1,服务器本来就是64位系统,8G内存,应该不是什么内存碎片的问题,是公司自己内部的系统,感觉配置已经可以了 2,不太明白,DocumentBuilder 能分批次写吗,麻烦详细一点,谢谢。
大然然 2018-01-04
  • 打赏
  • 举报
回复
不必每次都重新StringBuilder 写你的html 可以做成静态化,直接填充你的htmll里的content
卖报de小行家 2018-01-04
  • 打赏
  • 举报
回复
@sp1234

62,041

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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