【发布时间】:2012-07-31 13:19:50
【问题描述】:
我目前正在处理一个必须连续生成大约 16000 封电子邮件的批次(简报)。
不管它是不是垃圾邮件,我的问题是关于我如何生成这些电子邮件。
消息中的某些字段必须替换为自定义值(日期、用户名等)。
出于某些截止日期和代码可重用性的原因,我的模板是一个 HTML 文件,其中包含一些“_FIELDNAME”字段,可以通过正则表达式轻松发现:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
...
<body>
<p>Hi _NAME, _DATE newsletter.</p>
</body>
...
该文件大约有 1000 行,因此在加载时它是一个相当大的字符串。
首先,我在一个字符串中加载一次 HTML 文件模板:
string template = File.ReadAllText(@"Template/newsletter.html");
替换函数如下所示:
return new StringBuilder(template)
.Replace("_DATE", profileConfig.SelectedMonth.ToString("MMMM yyyy"))
.Replace("_NAME", profileConfig.Name)
.ToString();
问题是内存消耗在每次迭代中都会略有增加。 1000 次迭代大约 50MB,这是由于我的替换功能(我试图评论它,内存泄漏消失了)。
如何在我的 16000 次迭代中替换模板中的许多字段 (~50) 而不会溢出内存? 我尝试了几件事,比如使用正则表达式(但它使用字符串)或临时文件,但都不满意。
提前感谢您的帮助。
【问题讨论】:
-
这里为什么会出现内存泄漏?你怎么知道 GC 根本没有看到收集垃圾的必要性呢?
-
50Mb 1000 次迭代似乎并不多。这表明您将在 16000 次迭代结束时达到 800Mb 左右,这是假设您对泄漏正确(我认为您不是)。为什么会出现这个问题?
-
@MennanKara:这个
StringBuilder只有一个引用,当方法返回时它会自动“丢失”。没有必要做任何事情。 -
@Jon:链接页面上的答案说的完全一样,试图解决这个问题没有意义。
标签: c# .net memory-leaks replace