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

时间:2015-03-04 16:07:28

标签: c# xml performance linq-to-xml memory-consumption

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

我想知道我是否可以这样做,我必须少读内存并生成更快的结果。但速度比记忆更重要。因此,该解决方案有效。我只需要更快的东西,使用更少的内存 有什么建议吗?

2 个答案:

答案 0 :(得分:0)

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

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

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

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

答案 1 :(得分: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文档的文件。