XslCompiledTransform.Transform 64-разрядные проблемы с памятью - PullRequest
1 голос
/ 17 июня 2011

Наше приложение использует функцию XslCompiledTransform.Transform.Поведение является нормальным, если мы запускаем его в 32-битном режиме, однако при работе в 64-битном режиме потребление памяти просто слишком велико (и в итоге выдает исключение из памяти).Тот же код, та же машина - один работает, а другой нет .... Кто-нибудь видел подобную проблему и есть обходной путь?

Спасибо,

Ответы [ 4 ]

2 голосов
/ 25 января 2012

Это на самом деле OutOfMemoryException или StackOverflowException из-за недостатка памяти, выделяемой потоку? Я спрашиваю, потому что я столкнулся с этим типом проблемы на веб-сервере x64 под управлением IIS, так как он выделяет только 256 КБ стеку потоков по умолчанию . Мне пришлось выполнить некоторые из более крупных преобразований (, таких как DocBook в XSL-FO ) в потоке, чтобы обеспечить больше места для стека следующим образом:

var stackedThread = new Thread(RunXsltWithMoreMemory, 2 * 1024 * 1024);
var threadParameters = ThreadXsltParameters {
    InputStream = inputStream;    // Source XML
    OutputStream = outputStream;  // Resultant XML
};
stackedThread.Start(threadParameters);
stackedThread.Join();
1 голос
/ 02 апреля 2012

Я недавно столкнулся с этой проблемой и решил ее, скомпилировав свои XSLT с помощью утилиты командной строки xsltc.

 xsltc someXsl.xsl /settings:DTD+,document+,script-

Утилита командной строки xsltc описана здесь на MSDN: http://msdn.microsoft.com/en-us/library/bb399405.aspx.

А затем, после запуска утилиты командной строки, создается сборкакоторый вы используете в своем коде следующим образом:

 xmlTransform.Load(Assembly.Load(assemblyName).GetType(assemblyName));

Похоже, что это также значительно повысило производительность преобразований.

0 голосов
/ 05 февраля 2015

Хотя XslCompiledTransform является древней технологией на данный момент и, возможно, не будет широко использоваться, я провел некоторое недавнее тестирование в .NET 4.5, и кажется, что эта ошибка потребления памяти была исправлена.

Мне не удалось найти каких-либо определенных указаний от Microsoft (похоже, я больше не могу получить доступ к старой ошибке Connect), но тестирование с довольно сложным XSLT (несколько тысяч строк) с большим количеством выражений xpath не дает показать любое ненормальное использование памяти в 64-битных процессах в .NET 4.5. Выполнение этого же XSLT в 64-разрядной версии .NET 3.5 немедленно переходит на 6,5 ГБ на компьютере с 8 ГБ и продолжает расти.

Мне любопытно, может ли кто-либо еще воспроизводить неправильное использование памяти с помощью XslCompiledTransform в 64-разрядной версии .NET 4.5 или знает о каких-либо обновлениях от Microsoft, связанных с этой проблемой.

0 голосов
/ 27 июня 2011

Известная ошибка - Смотрите это:

http://connect.microsoft.com/VisualStudio/feedback/details/508748

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