在 C# 中合并大文件

本文关键字:文件 合并 | 更新日期: 2023-09-27 17:47:21

我有7-8个xml文件。每个大小约为 50 MB。在 C# 中以编程方式合并文件而不会出现 System.OutOfMemory 异常的最佳方法是什么? 到目前为止,我已经尝试在 StringBuilder 中读取每个文件,而不是将其放入字符串生成器数组中,但我仍然收到 system.outofmemoery 异常。有什么帮助吗??谢谢-尼梅什

在 C# 中合并大文件

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

xml的问题在于你不能只是将它们相互附加:你会破坏标签嵌套。 因此,您需要了解一些有关 xml 文件结构的信息,以便了解在每个文件边界上要执行的操作。

如果你有一些理论上可以与StringBuilder一起使用的东西,但由于内存限制而在实践中失败,你应该能够翻译StringBuilder的。附录() 和 .AppendLine() 方法调用 .写() 和 .WriteLine() 调用文件流。

您需要合并的内容的细节确实至关重要。但是,首先:您可能希望每个输入文件都有一个 XmlReader,对于输出文件需要一个 XmlWriter。这将允许您流式传输输入和输出。

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

就个人而言,当我必须处理XML文件(通常是由于身体暴力的威胁而被迫)时,我会这样做:

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

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

请定义"合并"。

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

如果你想真正生成一个新的有效xml,那么使用XmlTextReader。它不会读取内存中的整个文件。

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

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

不确定在这种情况下合并是什么意思。 您的意思是文件的简单串联,还是检查内容?

例如

文件1.xml

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

文件2.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>

考虑到您正在谈论的数据量,情况并非如此。 你的意思是?

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