1

我有一个包含大约 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);

我想知道我是否可以通过减少内存读取并产生更快结果的方式来做到这一点。不过,速度比记忆更重要。因此,该解决方案有效。我只需要更快的东西,使用更少的内存。
有什么建议么?

4

2 回答 2

0

根据您的规则的复杂性,以及数据在各个文件之间的相互依赖程度,您可能可以并行处理每个文件(或至少处理其中的某些块)。

鉴于 XDocument 在读取期间没有被更改,您肯定可以并行收集数据,这可能会提供速度优势。

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

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

于 2015-04-28T16:23:13.387 回答
0

一种方法是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 文档。

于 2015-04-28T18:42:56.887 回答