我有7-8个xml文件。每个大小约为50 MB。在没有获得System.OutOfMemory异常的情况下,在C#中以编程方式合并文件的最佳方法是什么?到目前为止,我已经尝试在StringBuilder中读取每个文件,而不是将它放在字符串构建器的数组中,但我仍然得到system.outofmemoery异常。任何帮助? 谢谢, -Nimesh
答案 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文件时(通常会受到身体暴力威胁),我这样做:
然后我积极地删除原始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将它们合并到文件系统中。