Интенсивная загрузка процессора XmlTextWriter
У меня есть веб-приложение, которое создает XML-каналы на лету, в зависимости от критериев, переданных через строку запроса.
Это очень простое приложение: оно считывает переменные строки запроса и использует их для форматирования данных (кэшированных данных из базы данных) в соответствующий формат XML.
Возвращенный XML-файл составляет около 25 МБ... там много данных.
Я использую XmlTextWriter для создания XML, а затем возвращаю его запрашивающей стороне как "application/octet-stream" - вложение, которое они могут загрузить.
Вопрос в том, что сборка XML, кажется, использует 100% ЦП и вызывает проблемы с другими моими приложениями.
У кого-нибудь есть опыт создания таких больших XML-файлов? Любые советы по снижению нагрузки на процессор?
Пример кода:
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. Вау, это неэффективно. Буду обновлять код. Спасибо всем!
1 ответ
Одна непосредственная проблема, которая приходит на ум, это Response.Writer(sw.ToString())
Похоже, вы пишете StringWriter
сначала затем отправка в выходной поток, почему бы не записать прямо в выходной поток здесь?
Я бы не ожидал, что это само по себе сильно повлияет на загрузку процессора или вызовет 100% загрузку процессора.
Что такое ProductCollection
, поскольку вы зацикливаетесь, это выглядит наиболее вероятной причиной высокой загрузки ЦП. Если ваш код правильно делает IEnumerable<Product>
и получение продуктов JIT, это может привести к большой загрузке ЦП, если вы получаете продукты для некоторого постоянного хранилища (например, каждая итерация требует некоторых независимых вызовов базы данных)
Не видя дальнейшего исходного кода, трудно сказать, что может быть причиной проблемы.