在解析 XML 个文件时减少内存并提高速度

Reducing memory and increasing speed while parsing XML files

我有一个包含大约 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 在读取过程中没有被更改,您肯定可以并行收集数据,这可能会提供速度优势。

https://msdn.microsoft.com/en-us/library/dd460693%28v=vs.110%29.aspx

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

一种方法是为每种不同的数据类型创建一个单独的 List<XElement>。例如:

List<XElement> Comments = new List<XElement>();
List<XElement> Options = new List<XElement>();
// etc.

然后对于每个文档,您可以浏览该文档中的元素并将它们添加到适当的列表中。或者,在伪代码中:

for each document
    for each element in document
        add element to the appropriate list

这样您就不必同时将所有文档加载到内存中。此外,您只需对每个文档进行一次传递。

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

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

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