gpt4 book ai didi

c# - 在没有内存泄漏的情况下替换巨大字符串中的文本

转载 作者:行者123 更新时间:2023-11-30 21:05:20 26 4
gpt4 key购买 nike

我目前正在处理一个必须连续生成大约 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)而不溢出内存?我尝试了一些东西,比如使用正则表达式(但它使用的是字符串)或临时文件,但两者都不让我满意。

预先感谢您的帮助。

最佳答案

如果您可以将 _DATE_NAME 等替换为 {0}{1}等你可以试试string.Format()

模板会变成:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
...
<body>
<p>Hi {0}, {1} newsletter.</p>
</body>
...

代码看起来像这样:

return string.Format(template, 
profileConfig.SelectedMonth.ToString("MMMM yyyy"),
profileConfig.Name
);

您实际上根本不需要通过 StringBuilder。如果您使用 File.ReadAllLines() 并且只交换包含标记的行中的值,您将大大提高速度(并且可能在资源使用方面)。

更新 为了强制使用 string.Format(string format, params object[] args) 重载,您可能必须将所有参数放入收藏。

以下应该使这个解决方案为您工作(我测试了多达 1000 个参数并且它的工作都非常快)。

List<string> tokenValues = new List<string> 
{
profileConfig.SelectedMonth.ToString("MMMM yyyy"),
profileConfig.Name,
<follow with your other values>
};
return string.Format(template, tokenValues.ToArray()); //.ToArray() is mandatory

关于c# - 在没有内存泄漏的情况下替换巨大字符串中的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11741050/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com