我有一个Web应用程序,可以动态创建XML提要,具体取决于通过查询字符串传入的条件。
这是一个非常简单的应用程序:它读取查询字符串变量,并使用它们将数据(来自数据库的缓存数据)格式化为适当的XML格式。
返回的XML文件大约是25MB ......有很多数据。
我正在使用XmlTextWriter构建XML,然后将其作为“application / octet-stream”返回给请求者 - 这是他们可以下载的附件。
问题是:构建XML似乎使用了100%的CPU,并导致我的其他应用程序出现问题。
有没有人有构建这么大的XML文件的经验?有关使流程减少CPU密集的任何提示吗?
代码示例是:
map.WriteRaw("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
map.WriteStartElement("rss");
map.WriteAttributeString("version", "2.0");
map.WriteAttributeString("xmlns:g", "http://base.google.com/ns/1.0");
map.WriteStartElement("channel");
map.WriteElementString("link", "http://www.mywebsite.com...");
ProductCollection items = Product.GetCachedSiteProducts();
foreach (Product p in items)
{
map.WriteStartElement("item");
........
map.WriteElementString("description", p.Description);
map.WriteElementString("g:id", p.SiteSku);
map.WriteElementString("g:condition", "new");
map.WriteElementString("g:price", p.Price.ToString() + " USD");
...............
map.WriteEndElement(); //item
}
}
map.WriteEndElement();//channel
map.WriteEndElement();//rss
Response.Write(sw.ToString());
更新:我正在回答我自己的问题。感谢那些让我发布更多代码的人,当我仔细观察时,这很简单。
代码使用“Response.write(map.ToString())”输出xml。哇,那效率很低。将更新代码。谢谢大家!
答案 0 :(得分:3)
我想到的一个直接问题是Response.Writer(sw.ToString())
这看起来像是先写入StringWriter
然后发送到输出流,为什么不直接写入输出流?
我不希望单独对CPU使用产生很大影响或导致100%的CPU使用率。
什么是ProductCollection
,因为你循环看起来是导致高CPU使用率的最可能原因。如果您的代码正在执行IEnumerable<Product>
并获取产品JIT,那么如果您获取某些持久存储的产品(例如,每次迭代需要一些独立的数据库调用),这可能会导致大量CPU使用。
如果没有看到更多的源代码,很难说出问题的原因可能是什么。