C# 解析XML文件时减少内存并提高速度

C# 解析XML文件时减少内存并提高速度,c#,xml,performance,linq-to-xml,memory-consumption,C#,Xml,Performance,Linq To Xml,Memory Consumption,我有一个包含大约30个随机命名的XML文件的目录。所以这个名字对他们的内容毫无线索。我需要根据预定义的规则将所有这些文件合并到一个文件中。不幸的是,使用简单的样式表太复杂了。 每个文件的根目录中最多可以有15个不同的元素。因此,我有15个不同的方法,每个方法都以XDocument作为参数,并在XML中搜索特定元素。然后它将处理这些数据。因为我以特定的顺序调用这些方法,所以我可以确保所有数据都以正确的顺序处理。 示例节点包括产品列表、特定产品代码的价格列表、产品名称的翻译列表、国家列表、特定国家的

我有一个包含大约30个随机命名的XML文件的目录。所以这个名字对他们的内容毫无线索。我需要根据预定义的规则将所有这些文件合并到一个文件中。不幸的是,使用简单的样式表太复杂了。 每个文件的根目录中最多可以有15个不同的元素。因此,我有15个不同的方法,每个方法都以XDocument作为参数,并在XML中搜索特定元素。然后它将处理这些数据。因为我以特定的顺序调用这些方法,所以我可以确保所有数据都以正确的顺序处理。 示例节点包括产品列表、特定产品代码的价格列表、产品名称的翻译列表、国家列表、特定国家的产品折扣列表等等。不,这些也不是很简单的结构

现在,我正在做这样的事情:

List<XmlFileData> files = ImportFolder.EnumerateFiles("*.xml", SearchOption.TopDirectoryOnly).Select(f => new XDocument(f.FullName)).ToList();
files.ForEach(MyXml, FileInformation);
files.ForEach(MyXml, ParseComments);
files.ForEach(MyXml, ParsePrintOptions);
files.ForEach(MyXml, ParseTranslations);
files.ForEach(MyXml, ParseProducts);
// etc.
MyXml.Save(ExportFile.FullName);
我想知道我是否可以这样做,我必须在内存中读得更少,并产生更快的结果。不过,速度比记忆更重要。因此,这个解决方案是有效的。我只需要一些更快的,占用更少内存的东西。
有什么建议吗?

根据规则的复杂性以及不同文件之间数据的相互依赖程度,您可能会并行处理每个文件或至少处理其中的某些部分

鉴于XDocument在读取过程中没有被更改,您完全可以并行地收集数据,这可能会带来速度优势


您应该检查正在加载的数据,以及是否可以以任何特殊方式处理这些数据,以降低内存使用率,甚至提高速度。

一种方法是为每种不同的数据类型创建一个单独的列表。例如:

List<XElement> Comments = new List<XElement>();
List<XElement> Options = new List<XElement>();
// etc.
这样,您就不必同时将所有文档加载到内存中。此外,您只需对每个文档进行一次传递

阅读完所有文档后,就可以将不同的元素连接到单个MyXml文档中。即:

MyXml = create empty document
Add Comments list to MyXml
Add Options list to MyXml
// etc.

这种方法的另一个好处是,如果数据总量大于内存中所能容纳的数据量,那么这些元素列表可以是文件。您会将所有注释元素写入注释文件,将选项写入选项文件,等等。一旦您读取了所有输入文档并将各个元素保存到文件中,然后,您可以读取每个元素文件以创建最终的XML文档。

您是以它们交错的方式合并它们,还是在上一个文档的根元素关闭后,下一个文档的根元素立即开始?它们交错。它们都可以包含一些信息,有些信息是重复信息。我得检查一下。啊!我想他们会的,但希望他们不会。它现在运行得有多快/慢?您当前的内存使用情况如何?速度取决于数据供应商。一个在几秒钟内得到处理,另一个需要5分钟以上。内存使用率约为1.5GB,但幸运的是我使用的是64位系统。较慢的文件大小约为350 MB,生成的文件大小大致相同。基本上,所有数据都被合并。
MyXml = create empty document
Add Comments list to MyXml
Add Options list to MyXml
// etc.