Ove*_*ave 5 c# xml file-io xmlwriter memory-management
有什么方法可以组合两个 XmlDocuments 而不将第一个保存在内存中?
我必须循环浏览多达一百个大(~300MB)XML 文件的列表,附加到每个多达 1000 个节点,重复整个过程几次(因为新节点列表被清除以节省内存)。目前我XmlDocument在追加新节点之前将整个加载到内存中,这目前是站不住脚的。
你认为最好的方法是什么?我有一些想法,但我不确定哪个是最好的:
XMLDocument,而是使用XmlReader和XmlWriter同时写入临时文件,该文件随后被重命名。XmlDocument仅用于新节点,然后手动将其写入现有的文件(即file.WriteLine( "<node>\n" )任何帮助都感激不尽。
编辑一些更多细节以回答一些评论:
该程序将几个大型日志解析为 XML,按来源分组到不同的文件中。它只需要每天运行一次,并且一旦编写了 XML,就会有一个轻量级的专有阅读器程序来提供有关数据的报告。该程序每天只需要运行一次,所以可能会很慢,但运行在执行其他操作的服务器上,主要是文件压缩和传输,不能影响太多。
数据库可能会更容易,但公司不会很快这样做!
按原样,程序在开发机器上运行最多只使用几 GB 的内存,但在服务器上运行时会抛出内存不足的异常。
最终编辑 该任务的优先级很低,这就是为什么获取数据库只需要额外花费的原因(尽管我会研究 mongo)。
该文件只会被附加到,并且不会无限增长 - 每个最终文件仅用于一天的日志,然后在第二天生成新文件。
我可能会使用 XmlReader/Writer 方法,因为它最容易确保 XML 有效性,但我已经考虑了您的所有评论/答案。我知道拥有这么大的 XML 文件并不是一个特别好的解决方案,但这是我的限制,所以感谢提供的所有帮助。
如果您希望完全确定 XML 结构,那么使用 XMLWriter 和 XMLReader 是最好的方法。
但是,为了获得绝对最高的性能,您可以使用直接字符串函数快速重新创建此代码。您可以这样做,尽管您将失去验证 XML 结构的能力 - 如果一个文件有错误,您将无法更正它:
using (StreamWriter sw = new StreamWriter("out.xml")) {
foreach (string filename in files) {
sw.Write(String.Format(@"<inputfile name=""{0}"">", filename));
using (StreamReader sr = new StreamReader(filename)) {
// Using .NET 4's CopyTo(); alternatively try http://bit.ly/RiovFX
if (max_performance) {
sr.CopyTo(sw);
} else {
string line = sr.ReadLine();
// parse the line and make any modifications you want
sw.Write(line);
sw.Write("\n");
}
}
sw.Write("</inputfile>");
}
}
Run Code Online (Sandbox Code Playgroud)
根据输入 XML 文件的结构方式,您可能会选择删除 XML 标头、文档元素或其他一些不必要的结构。您可以通过逐行解析文件来做到这一点
| 归档时间: |
|
| 查看次数: |
2380 次 |
| 最近记录: |