Интенсивная загрузка процессора XmlTextWriter - PullRequest
0 голосов
/ 09 января 2012

У меня есть веб-приложение, которое создает 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 Ответ

3 голосов
/ 09 января 2012

Одна непосредственная проблема, которая приходит на ум, это Response.Writer(sw.ToString())

Похоже, что вы сначала записываете StringWriter, а затем отправляете в выходной поток, почему бы не записать прямо в выходной поток здесь?

Я бы не ожидал, что одно это сильно изменит загрузку процессора или приведет к 100% загрузке процессора.

Что такое ProductCollection, поскольку при циклическом просмотре это выглядит наиболее вероятной причиной высокой загрузки ЦП. Если ваш код правильно выполняет IEnumerable<Product> и получает продукты JIT, это может привести к большой загрузке ЦП, если вы получаете продукты для некоторого постоянного хранилища (например, для каждой итерации требуются некоторые независимые вызовы базы данных)

Не видя дополнительного исходного кода, трудно сказать, что может быть причиной проблемы.

...