有没有一种方法可以在不将第一个XmlDocument保存在内存中的情况下将两个XmlDocuments合并?
我必须循环遍历多达一百个大约300MB的XML文件列表,向每个文件追加多达1000个节点,并重复整个过程几次(因为新节点列表被清除以节省内存)。目前,在添加新节点之前,我将整个XmlDocument加载到内存中,这是不可行的。
您认为最好的方法是什么?我有一些想法,但不确定哪种最好:
1.永远不要加载整个XMLDocument,而是同时使用XmlReader和XmlWriter写入临时文件,然后将其重命名。
2.只为新节点创建XmlDocument,然后手动将其写入现有文件(即file.WriteLine("<node>\n"))。
3.其他方法?
任何帮助都将不胜感激。
编辑:根据一些评论中的答案提供更多细节:
该程序将几个大型日志解析为XML,并按源分组到不同文件中。它只需要每天运行一次,一旦编写了XML,就有一个轻量级专有读取器程序,可以对数据进行报告。该程序只需要每天运行一次,因此可以很慢,但是在执行其他操作(主要是文件压缩和传输)的服务器上运行,这些操作不能太多地影响。
数据库可能会更容易,但公司不会很快这样做!
目前,该程序在dev机器上运行时使用的内存不超过几GB,但在服务器上运行时会抛出内存不足异常。
最终编辑: 任务相当低优先级,这就是为什么只要花费额外的费用才能获得数据库(尽管我会研究mongo)。
文件将仅被附加,并且不会无限增长-每个最终文件仅用于一天的日志,然后在第二天生成新文件。
我可能会使用XmlReader / Writer方法,因为它最容易确保XML有效性,但我已经考虑了您所有的评论/答案。我知道拥有如此大的XML文件不是特别好的解决方案,但这是我所限制的,所以感谢提供的所有帮助。
我必须循环遍历多达一百个大约300MB的XML文件列表,向每个文件追加多达1000个节点,并重复整个过程几次(因为新节点列表被清除以节省内存)。目前,在添加新节点之前,我将整个XmlDocument加载到内存中,这是不可行的。
您认为最好的方法是什么?我有一些想法,但不确定哪种最好:
1.永远不要加载整个XMLDocument,而是同时使用XmlReader和XmlWriter写入临时文件,然后将其重命名。
2.只为新节点创建XmlDocument,然后手动将其写入现有文件(即file.WriteLine("<node>\n"))。
3.其他方法?
任何帮助都将不胜感激。
编辑:根据一些评论中的答案提供更多细节:
该程序将几个大型日志解析为XML,并按源分组到不同文件中。它只需要每天运行一次,一旦编写了XML,就有一个轻量级专有读取器程序,可以对数据进行报告。该程序只需要每天运行一次,因此可以很慢,但是在执行其他操作(主要是文件压缩和传输)的服务器上运行,这些操作不能太多地影响。
数据库可能会更容易,但公司不会很快这样做!
目前,该程序在dev机器上运行时使用的内存不超过几GB,但在服务器上运行时会抛出内存不足异常。
最终编辑: 任务相当低优先级,这就是为什么只要花费额外的费用才能获得数据库(尽管我会研究mongo)。
文件将仅被附加,并且不会无限增长-每个最终文件仅用于一天的日志,然后在第二天生成新文件。
我可能会使用XmlReader / Writer方法,因为它最容易确保XML有效性,但我已经考虑了您所有的评论/答案。我知道拥有如此大的XML文件不是特别好的解决方案,但这是我所限制的,所以感谢提供的所有帮助。
File.Replace
将旧文件替换为临时文件。这样可以在操作过程中出现任何问题时保存您的数据。 - Dour High Arch