2012-08-03 28 views
4

有没有办法将两个XmlDocuments组合起来,而不需要在内存中保留第一个XmlDocuments?如何在C#中高效地使用内存追加到大型XML文件

我必须循环查看多达一百个大型(〜300MB)XML文件的列表,每个最多可附加1000个节点,重复整个过程数次(因为清除新节点列表以节省内存) 。目前,我在将所有XmlDocument加载到内存中,然后再添加新的节点,目前不成立。

你会说什么是最好的方式去做这件事?我有一些想法,但我不知道这是最好的:

  1. 决不加载整个XMLDocument,而是采用XmlReaderXmlWriter同时写入,随后更名为临时文件。
  2. 仅对所新节点XmlDocument,然后手动将其写在现有文件(即file.WriteLine("<node>\n")
  3. 别的东西吗?

任何帮助将非常感激。

编辑在回答一些意见的时候会提供一些更多的细节:

该程序将几个大日志解析成XML,按照源码分组成不同的文件。 s每天运行一次,一旦写入XML,就会有一个轻量级的专有阅读器程序,用于报告数据。该程序只需要每天运行一次,因此可能会很慢,但运行在执行其他操作的服务器上,主要是文件压缩和传输,这些操作不会受到太多影响。

数据库可能会更容易,但公司不会很快这么做!

正因为如此,该程序最多使用几GB的内存在开发机器上运行,但在服务器上运行时会抛出内存不足异常。

最后编辑 的任务是相当低prority,这就是为什么它只会花费额外得到一个数据库(虽然我会考虑蒙戈)。

该文件将仅附加到,并且不会无限增长 - 每个最终文件仅用于一天的日志值,然后在第二天生成新文件。

我可能会使用XmlReader/Writer方法,因为它确保XML有效性是最容易的,但我已将所有评论/答案都考虑在内。我知道拥有这么大的XML文件并不是一个特别好的解决方案,但这正是我所限制的,所以感谢所有的帮助。

+2

我想数字1是要走的路,但我没有像这样的大文件的实际工作经验。 – 2012-08-03 15:54:23

+0

什么是最终目标,我的意思是它的成就 – HatSoft 2012-08-03 16:02:40

+1

你可以给出更多关于这个问题的背景吗?也许切换到数据库是一个更好的解决方案。 – eabraham 2012-08-03 16:03:28

回答

2

如果您希望完全确定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>"); 
    } 
} 

根据您输入的XML文件的方式结构化的,您可以选择删除XML标头,也许是文档元素或其他一些不必要的结构。你可以通过解析文件行来做到这一点

+0

感谢您的CopyStream链接 - 即使我现在不使用它,我相信它将在未来有用! – 2012-08-06 15:09:16

+0

傻我 - 我忘了.NET 4的'CopyTo'方法 - 这里的解释http://msdn.microsoft.com/en-us/library/dd782932.aspx。它现在内置。 – 2012-08-09 19:47:46

相关问题