如何提高使用链接到实体和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
,但似乎没有任何区别。
看起来您正在多次获取整个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
这样将所有数据保存在内存中的解决方案。