[英]Best way to write DataTables from a Web Service into XML?
我正在尝试重构一些运行缓慢的代码,这些代码使用几个数据表的嵌套循环来编写XML。 我读到使用linq编写xml会更快。 我对linq并不精通,所以我希望能在这里得到一些帮助。
我需要提到的一些事情是当前架构使用webservice,它在dataTables中向我们返回数据。 然后我们遍历数据表(迭代地),并且有几个导致几个嵌套循环。
例:
dt1 = Webservice.getStuff();
for each (datarow r1 in dt1.Rows) {
dt2 = Webservice.getMoreStuff(r1[col1], r1[col2]);
// write out some xml
for each (datarow r2 in dt2.Rows) {
dt3 = Webservice.getEvenMoreStuff(r2[col1], r2[col2]);
// write out more xml
for each (datarow r3 in dt3.Rows) {
// write out more xml
}
}
}
正如您所看到的,显而易见的原因,这非常缓慢。 有没有办法加速使用linq? 你们有什么建议作为一种更有效的方法来重构这个? 如果细节含糊不清,我很抱歉......
我感谢任何人提供的任何帮助。
在这种情况下,编写XML并不会减慢你的速度 。 与进行所有Web服务调用所花费的时间相比,该速度应该可以忽略不计。
我不会专注于编写XML,而是试图弄清楚如何压缩Web服务调用的数量,以便您可以一次获取所有数据,而不是像这样进行嵌套调用。
我担心你的需要无法治愈。 因为我很确定是什么让这个方法变慢所以不是你写出xml的方式,而是你获取数据的方式。 如果写出xml会有任何改进,那就不会有明显的比例。 我建议你修改你获取数据的方式。 尽量减少WebService调用的数量。
如果你想使用Linq2Xml,你还需要Linq2Datasets。
这样,您可以将嵌套for循环更改为Linq查询并选择XML。
我确实使用XmlWriter可能会更快,并且肯定会使用更少的内存。 但是要写一些东西会多一点。
使用linq到xml和linq到数据集,您可以像这样创建自己的xml:
static void Main(string[] args)
{
DataTable t = getStuff("test");
var xml = new XElement("Main", from row in t.AsEnumerable()
select new XElement("firstlevel",
new XAttribute("a", row["a"]),
new XAttribute("b", row["b"]),
from row2 in getStuff(row["a"].ToString()).AsEnumerable()
select new XElement("secondlevel",
new XAttribute("a", row2["a"]),
new XAttribute("b", row2["b"]),
from row3 in getStuff(row2["a"].ToString()).AsEnumerable()
select new XElement("thirdlevel",
new XElement("a", row3["a"]),
new XElement("b", row3["b"])))));
Console.WriteLine(xml.ToString());
}
private static DataTable getStuff(string s)
{
Random r=new Random(s.GetHashCode());
DataTable t = new DataTable();
t.Columns.Add("a");
t.Columns.Add("b");
for (int i = 0; i < 2; i++)
{
t.Rows.Add (r.Next().ToString(), r.Next().ToString());
}
return t;
}
你必须重新考虑你的解决方案,以摆脱所有循环的WS调用。 这是一个严重的性能下降。
您没有说明编写XML的方式或编写XML的位置。
如果你正在写一个字符串。 停止,然后写一个流。
如果要写入缓冲字符串,请查看缓冲区的大小。 如果从ASP.NET页面或处理程序编写,则定期调用Response.Flush()。
这里有一个平衡,因为写入缓冲区几乎总是比写入流更快。 但是,写入自动调整大小缓冲区的速度越慢,调整大小就越大。 更重要的是,无论处理什么,XML都无法开始行动,直到它开始接收一些,直到第一次刷新之后才会发生。
因此,这里可能存在改进的余地,尽管对Web服务的调用可能超过可以获得的收益。 也许这也可以改进,如果你重写webservice响应的解析,以便在解析时yields
项目,这意味着你可以在收到整个响应之前开始处理响应。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.