如何提高使用链接到实体和XElement生成XML的应用程序的性能?

本文关键字:XML 生成 应用程序 性能 XElement 何提高 链接 实体 | 更新日期: 2023-09-27 18:11:04

我已经构建了一个应用程序,它使用link -to- entities和XElement生成一个大型XML文件。它占用了我们2GHz服务器的整个核心大约半小时,使用了大约1GB的内存。

我正在做以下类型的工作:

var xml = from x in dbContext.Table1
          select new XElement("Table1",
                     new XElement("Field1", x.Field1),
                     new XElement("Field2", x.Field2),
                     new XElement("Field3", x.Field3),
                     new XElement("MoreFields",
                         new XElement("FieldA", x.MoreFields.FieldA),
                         new XElement("FieldA", x.MoreFields.FieldA),
                         new XElement("FieldA", x.MoreFields.FieldA.DoSomeWorkWithThisField())
    )
);

我有另一个层次的深度或两个和几个字段已经完成的工作,如解析int的字符串使用RegEx.Match()

谁有什么优化或重构的建议?我试过使用XStreamingElement,但似乎没有任何区别。

如何提高使用链接到实体和XElement生成XML的应用程序的性能?

看起来您正在多次获取整个Table1

你能把它取到List<T>然后重复使用吗?

var list = dbContext.Table1.ToList();
var xml = new XElement("Table1",
    new XElement("Field1", list.Field1),
    new XElement("Field2", list.Field2),
    new XElement("Field3", list.Field3),
    new XElement("MoreFields",
        new XElement("FieldA", list.MoreFields.FieldA),
        new XElement("FieldA", list.MoreFields.FieldA),
        new XElement("FieldA", list.MoreFields.FieldA.DoSomeWorkWithThisField())
    )
);

我怀疑还有比这更复杂的东西,但基本上-提前从内存中取出你需要的东西,然后从那里开始工作。如果您只需要使用一项数据一次,那么只在需要时才这样做是可以的,但要避免一次又一次地提取相同的数据。

你生成的文档有多大,你的机器有多少内存?您可能想尝试查看性能计数器—您可能花费了大部分时间进行垃圾收集。

对于大型文档,您应该考虑像XmlWriter这样的流解决方案,而不是像XDocument这样将所有数据保存在内存中的解决方案。