如何高效编辑大体积XML文件并完成批量文本翻译任务
性能优化方案
1. 优先消除重复翻译浪费
30万行XML中通常存在大量重复的Text内容,优先增加翻译缓存可避免重复调用翻译接口,多数场景下可降低90%以上的耗时:
// 线程安全的翻译缓存 private static ConcurrentDictionary<string, string> _translateCache = new ConcurrentDictionary<string, string>();
调用翻译前先查询缓存,已翻译过的内容直接取缓存结果即可。
2. 并行处理替换串行遍历
XmlDocument的DOM对象非线程安全,建议先串行收集所有需要翻译的条目,再针对耗时的翻译步骤做并行处理,既避免多线程操作DOM的冲突,又能充分利用CPU资源:
// 先串行收集所有待翻译条目,这步耗时极低 var toTranslateList = new List<(XmlNode TextNode, string OriginText)>(); foreach (XmlNode item in nodeList) { var textNode = item.SelectSingleNode("Text"); if (textNode == null) continue; var originText = textNode.InnerText; if (!re.IsMatch(originText)) { toTranslateList.Add((textNode, originText)); } } // 并行执行翻译,可根据翻译接口的限流规则调整最大并行度 Parallel.ForEach(toTranslateList, new ParallelOptions { MaxDegreeOfParallelism = 8 }, item => { if (_translateCache.TryGetValue(item.OriginText, out var translatedText)) { item.TextNode.InnerText = translatedText; return; } translatedText = translate(item.OriginText, "en", "fr"); _translateCache.TryAdd(item.OriginText, translatedText); item.TextNode.InnerText = translatedText; });
注意MaxDegreeOfParallelism不要设置过高,避免触发翻译接口的限流规则反而导致请求失败增加耗时。
3. 替换XML处理方式降低加载/保存开销
XmlDocument为DOM加载模式,需要一次性把整个XML加载到内存中。如果后续XML还会持续变大,可改用XmlReader + XmlWriter的流式处理方案,边读边写无需加载全量DOM,内存占用可降低到MB级别,加载和保存的速度也会明显提升。
4. 额外优化建议
如果翻译接口支持批量提交,可将10-20条文本打包为单次请求提交,能省去大量单条请求的网络开销,优化幅度远高于单纯提升并行度。
内容的提问来源于stack exchange,提问作者takatto
相关产品推荐
相关产品推荐

