2012-06-07 3 views
1

Я искал поисковое решение для веб-приложения (.NET 4), которое было написано поставщиком.MSXML и .NET - Использование памяти

У нас были проблемы с этим вопросом в течение последних нескольких недель.

Первоначально основное внимание уделялось стороне базы данных. Теперь, когда я чувствую себя комфортно, управляя этой частью уравнения, я потратил немало времени на отладку веб-приложения, чтобы узнать, откуда исходит фактическая скорость.

Я обнаружил, что в этой конкретной части веб-приложения открывается новое окно Internet explorer для отображения большого количества XML-данных, которые возвращаются из базы данных.

После просмотра кода и использовать отладчик, чтобы попытаться выяснить, что происходит ... вот что я нашел:

Когда код на этой конкретной странице, заполнить все, процесс Iexplore имеет частный рабочий комплект - 692 044 тыс. Кажется, это результат многочисленных элементов управления activex для msxml3.dll.

После некоторых исследований я обнаружил этот Майкрософт: http://support.microsoft.com/?scid=kb%3Ben-us%3B815112&x=15&y=14

Он заявляет:. «Microsoft не поддерживает использование MSXML (COM на основе XML-анализаторе от Microsoft) в приложениях .NET MSXML использует резьб модели и механизмы сбора мусора, которые несовместимы с .NET Framework. Использование MSXML в приложениях .NET через COM-совместимость может привести к неожиданным проблемам, которые трудно отлаживать. Microsoft не рекомендует или не поддерживает непосредственную инстанцирование и использование объектов MSXML. NET, и Microsoft не рекомендует или не поддерживает сортировку указателей интерфейса MSXML через границу взаимодействия. "

Это одна часть кода, который создает объект ActiveX:

   var oTmp = new ActiveXObject("MSXML2.Domdocument"); 
       oTmp.loadXML('<plan_data>' + returnValue + '</plan_data>'); 

Process Explorer поднимает несколько Msxml3.dll, загруженного в процесс IExplore по мере увеличения памяти. Даже после закрытия этого конкретного окна он, похоже, не очищается должным образом, потому что он все еще использует около 220 000 К памяти (вероятно, из-за механизмов сбора мусора, перечисленных выше).

Итак, мой вопрос: может ли кто-нибудь здесь, кто знаком с этим, предлагать советы, если это похоже на плохо разработанный раздел веб-приложения?

Я хотел бы получить эту информацию у разработчика и попросить их взглянуть на нее, но я надеялся, что кто-то сначала даст мне профессиональный совет.

спасибо.

+1

Почему ты сосредоточить внимание на стороне базы данных * до того, как вы измерили узкое место? ;-) Первое правило оптимизации - «сначала измерение». –

+0

Потому что мне сказали! :) – user1441145

+0

один вопрос: зачем вам нужно «отображать большое количество XML-данных, которые возвращаются из базы данных»? Пользователи не собираются читать каким-либо разумным способом огромное количество XML ... Где этот XML заканчивается? –

ответ

1

Каждый раз, когда вы обрабатываете большую структуру XML в памяти и затем действуете на нее, это довольно интенсивная операция. Если вам действительно нужно сохранить весь документ в памяти, посмотрите на замену вашего текущего кода на XDocument из пространства имен System.Xml.Linq.

Если вам нужно только один раз передать XML-документ, выполнив операции при чтении каждого узла, просмотрите Streaming Transform of Large XML Documents.

EDIT

@Yahia делает хороший момент, что я пропустил ... этот код, кажется, выполняется на стороне клиента. Это так? Если да, почему бы просто не разрешить IE (ваш ActiveX будет работать только в IE, некоторые другие браузеры с плагинами ;-) отображают полученный XML. Если XML не слишком велик, он отлично справляется с этим (хотя выше нескольких МБ занимает очень много времени, чтобы выполнить начальную обработку).

0

Код, который вы показываете, является кодом JavaScript, который выполняется внутри браузера ... в этом отношении указанная статья KB не относится к вашей ситуации ..., которая говорит: «Плохая конструкция для загрузки» большого количества XML "в браузере - как вы обнаружили.

Solutions может быть использование сервера на основе механизма подкачки и/или предложить какой-то механизм фильтрации в пользовательском интерфейсе, так что никогда не бывает ситуация, когда полный XML должны быть в браузере ...