合并C#中的大文件

时间:2008-09-29 15:38:08

标签: c#

我有7-8个xml文件。每个大小约为50 MB。在没有获得System.OutOfMemory异常的情况下,在C#中以编程方式合并文件的最佳方法是什么?到目前为止,我已经尝试在StringBuilder中读取每个文件,而不是将它放在字符串构建器的数组中,但我仍然得到system.outofmemoery异常。任何帮助? 谢谢, -Nimesh

7 个答案:

答案 0 :(得分:3)

关于stringbuilder的事情是你仍然试图将整个内容保存在内存中。您希望一次只在内存中保留一小部分,这意味着使用文件流。不要将整个文件读入内存,在其上打开流并继续从流中读取。

xml的问题在于你不能只是将它们相互追加:你将打破标签嵌套。因此,您需要了解xml文件的结构,以便了解每个文件边界的操作。

如果你有一些理论上与StringBuilder有关的东西,但由于内存限制只能在实践中失败,你应该能够将StringBuilder的.Append()和.AppendLine()方法调用转换为.Write()和。 WriteLine()调用文件流。

答案 1 :(得分:3)

您需要合并的细节确实至关重要。但是,要启动您:您可能需要为每个输入文件创建一个XmlReader,并为输出文件创建一个XmlWriter。这将让您流式传输输入和输出。

另一种选择是使用从LINQ到XML的XStreamingElement。我对此没有任何经验,但它可能是一个更简单的API。 (LINQ to XML的其余部分肯定比DOM API更好。)

答案 2 :(得分:1)

请定义“合并”。

如果您只想连接文件,请使用StreamReader,并逐行阅读。

如果您想要实际生成新的有效xml,请使用XmlTextReader。它不会读取内存中的整个文件。

答案 3 :(得分:1)

就个人而言,当我来处理XML文件时(通常会受到身体暴力威胁),我这样做:

  1. 通过DataSet.ReadXML()
  2. 将每个文件加载到.NET DataSet中
  3. 合并信息(通过DataSet查询)。
  4. 通过DataSet.WriteXML()
  5. 将组合的DataSet写出为XML

    然后我积极地删除原始XML文件并擦除磁盘上存在的扇区以消除污点。 : - )

答案 4 :(得分:0)

这取决于您的合并意味着什么,因为您尚未发布有关架构的任何信息。

在单个集合中最简单的同构简单元素的情况下,您只需直接合并到磁盘上的新文件,避免内存中的大量工作,确保外部包含元素被剥离并添加到集合周围。 / p>

答案 5 :(得分:0)

在这种情况下,不确定合并的含义。你的意思是文件的简单连接,还是你检查内容?

例如,

file1.xml

<items>
    <item id="1">
        <name>Widget</name>
    </item>
    <item id="2">
        <name>Widget 2</name>
    </item>
</items>

file2.xml

<items>
    <item id="3">
        <name>Widget</name>
    </item>
    <item id="4">
        <name>Widget 2</name>
    </item>
</items>

可以合并为

<items>
    <item id="1">
        <name>Widget</name>
    </item>
    <item id="2">
        <name>Widget 2</name>
    </item>
</items>
<items>
    <item id="3">
        <name>Widget</name>
    </item>
    <item id="4">
        <name>Widget 2</name>
    </item>
</items>

这非常简单,或者

<items>
    <item id="1">
        <name>Widget</name>
    </item>
    <item id="2">
        <name>Widget 2</name>
    </item>
    <item id="3">
        <name>Widget</name>
    </item>
    <item id="4">
        <name>Widget 2</name>
    </item>
</items>

考虑到您所谈论的数据量,情况就不那么好了。你是什​​么意思?

答案 6 :(得分:0)

通过调用“copy a.xml + b.xml”命令或通过调用“copy”命令使用的windows filesystem API将它们合并到文件系统中。