繁体   English   中英

将DataTables从Web服务写入XML的最佳方法?

[英]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调用的数量。

听起来你需要首先剖析你的应用程序 - 也许免费试用ANTS或类似的东西对你有用

如果你想使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM