XslCompiledTransform против XslTransform и как насчет OOM для хорошей меры? - PullRequest
2 голосов
/ 13 января 2009

Так что какое-то время я использовал XslCompiledTransform, потому что это то, что Microsoft говорит мне, что мне нужно использовать, поскольку XslTransform устарела. Недавно мне пришлось использовать его с преобразованием, имеющим почти 100 000 строк (сгенерированный xsl - конечно). Когда я использовал свое приложение, я был шокирован, увидев всплывающее окно OOM. Неважно, что я сделал - OOM - это все, что я получаю ... Для хихиканья я вернулся к XslTransform ... Тот же самый точный код, меняющий XslCompiledTransform на XslTransform, и он отлично работает ...

Может кто-нибудь сказать мне, как работать с OOM - есть ли какой-нибудь swtich на XslCompiledTransform? Я не знаю, как вы сможете воспроизвести точную проблему, но если у кого-то есть какие-либо ответы, они очень ценятся.

Спасибо - код ниже:

Работает:

XslTransform myXslTransform = new XslTransform();
myXslTransform.Load(xslWith100ThousandLines);
MemoryStream m = new MemoryStream();
myXslTransform.Transform(myXPathDocument, null, m);
m.Flush();
m.Close();

Сбой с OOM

XslCompiledTransform cxslt = new XslCompiledTransform();
cxslt.Load(xslWith100ThousandLines);
MemoryStream m = new MemoryStream();
cxslt.Transform(myXPathDocument, null, m);
m.Flush();
m.Close();

Ответы [ 4 ]

2 голосов
/ 14 января 2009

хорошо, так что теперь я думаю, может быть, это больше «Майкрософт, являющаяся Майкрософт» ... догадываясь, я изменил целевую платформу обратно на «Любой ЦП», закрыл ВСЕ мои экземпляры Visual Studio и открыл мой проект заново. Затем я очищаю, перекомпилирую и перезапускаю и снова получаю OOM ...

Затем я установил целевую платформу обратно на x86 и низкий уровень и больше не видел OOM! У меня было много проблем, связанных с x64, таких как эта, и в будущем я буду обязательно включать их в любые сообщения ... чаще всего это связано с x64 ...

странно ... но проблема "решена" ...: S

0 голосов
/ 14 января 2009

Удивительно, но у меня сложилось впечатление, что старый XslTransform просто прикован к новому XslCompiledTransoform.

Вы получили OOM при первом использовании? Помните, что все скомпилированное (XslCompiledTransoform, XmlSerializer, Regex with RegexOptions.Compiled) загружает сборки в ваш домен приложений. Сборки не могут быть удалены после добавления в домен приложений. У вас есть несколько вариантов здесь:

  1. Загрузите сборки в другой домен приложений и удалите этот домен после завершения работы с ним. Это довольно сложно и сложно. Это позволит вашему приложению освободить использованную память.
  2. Создать кеш XslCompiledTransforms. НИКОГДА не создавайте преобразование снова. Этот способ позволит вашему приложению ограничить рост использования памяти. Возможно, вы захотите (hash + base64) / проверить контрольную сумму XSL заранее и использовать эту строку в качестве ключа в словаре.

Если вы генерируете этот XSLT-файл во время разработки, возможно, вам стоит получить созданную им сборку и упаковать ее в ваше приложение вместо XSLT. Если это во время выполнения, вам придется использовать опцию (1) выше.

0 голосов
/ 14 января 2009

ну ... программирование в мире окон всегда загадка ...

Я благодарю вас обоих за ваши ответы, однако сегодня - при попытке воспроизвести проблему (после того, как прошло около 14 часов), проблема полностью исчезла ...

Единственное, что я сделал по-другому, это установил компилятор на x86 вместо x64, и теперь код работает точно так, как я ожидал с самого начала, и я остался в замешательстве, как никогда ...

просто чтобы все знали, что я не сумасшедший, вот диспетчер задач из двух последовательных прогонов: alt text

Я не уверен, как или почему ... но есть это ...

0 голосов
/ 13 января 2009

Сначала я подумал, что вы должны подать это в Microsoft Connect как ошибку, но подумав об этом, на самом деле это не ошибка. С таким большим XSL-документом вы, скорее всего, столкнулись с исключением OOM.

Я бы по-прежнему разместил его там, просто потому, что не ожидал, что новый XslCompiledTransform завершится сбоем, если XslTransform нет.

Если результирующий документ большой, возможно, сохранить документ во временном файле FileStream на диске и затем работать с ним при обработке документа?

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