在 C# 中合并大文件
本文关键字:文件 合并 | 更新日期: 2023-09-27 17:47:21
我有7-8个xml文件。每个大小约为 50 MB。在 C# 中以编程方式合并文件而不会出现 System.OutOfMemory 异常的最佳方法是什么? 到目前为止,我已经尝试在 StringBuilder 中读取每个文件,而不是将其放入字符串生成器数组中,但我仍然收到 system.outofmemoery 异常。有什么帮助吗??谢谢-尼梅什
关于字符串生成器的事情是你仍然试图将整个内容保存在内存中。 您一次只想在内存中保留一小部分,这意味着使用文件流。 不要将整个文件读入内存,打开其上的流并继续从流中读取。
xml的问题在于你不能只是将它们相互附加:你会破坏标签嵌套。 因此,您需要了解一些有关 xml 文件结构的信息,以便了解在每个文件边界上要执行的操作。
如果你有一些理论上可以与StringBuilder一起使用的东西,但由于内存限制而在实践中失败,你应该能够翻译StringBuilder的。附录() 和 .AppendLine() 方法调用 .写() 和 .WriteLine() 调用文件流。
您需要合并的内容的细节确实至关重要。但是,首先:您可能希望每个输入文件都有一个 XmlReader,对于输出文件需要一个 XmlWriter。这将允许您流式传输输入和输出。
另一种选择是使用 XStreamingElement 从 LINQ 到 XML。我没有任何经验,但它很可能是一个更简单的 API。(LINQ to XML的其余部分肯定比DOM API更好。
就个人而言,当我必须处理XML文件(通常是由于身体暴力的威胁而被迫)时,我会这样做:
- 通过 DataSet.ReadXML() 将每个文件加载到 .NET 数据集中
- 合并信息(通过数据集查询)。
- 通过 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将它们合并到文件系统中。