Архив рубрики: полезности

XslCompiledTransform и OutOfMemoryException

Столкнулся с проблемой, что при использовании xslt преобразований возникает Out Of Memory, если входной XML файл имеет достаточно большой объем, а приложение в ресурсах ограниченно, например по тому, что работает в 32-х разрядной системе. Под катом способы, как с этим можно бороться.

1. Отключение отладки

Если вызвать конструктор по умолчанию для XslCompiledTransform, то он автоматически включает режим записи отладочной информации. Во время отладки это может быть и полезно, но вот в работающем приложении это лишняя память. Поэтому надо пользоваться конструктором с булевым параметром и в явном виде ее отключать:

XslCompiledTransform xslt = new XslCompiledTransform(false);

2. Предварительная компиляция XSLT

Как это не странно звучит, но для того чтобы применить XSLT преобразование к XML файлу, файл содержащий это преобразование надо скомпилировать. Можно сэкономить память, если сделать это предварительно ручками.
Для этого, необходимо по пути вида:
C:Program Files (x86)Microsoft SDKsWindowsv8.1AbinNETFX 4.5.1 Tools
найти утилиту: xsltc.exe
и запустить ее указав какой файл с xslt преобразовать, в какую сборку и с каким именем класса записать получившийся код.
Получится что-то вида:
xsltc.exe /class:ClassName /out:OutputXSLT.dll input.xslt
Дальше все просто, подключаем сборку в проект, ну или загружаем ее во время выполнения через Reflection.
Все, теперь вместо пути к файлу, можем указать тип из нашей dll:

XslCompiledTransform xslt = new XslCompiledTransform(false);
xslt.Load(typeof(ClassName));

3. Если приходится преобразовывать много файлов одним XSLT

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

using (XmlWriterxmlWriter = XmlWriter.Create(outputFileName))
{
    xslt.Transform(InputXmlFileName, xmlWriter);
}

4. Общее

Ну и последнее, можно попробовать собрать проект в Release конфигурации, может и на этом что-то полуситься выграть по памяти.

Установка веб-приложений пакетом

Каждый раз как поднимаю новый IIS, мучаюсь вспомнить как называется расширение позволяющее ставить приложения через пакеты. Так что это просто напоминалка для себя.
Штука называется "Веб-развертывание 2.0" и доступна здесь. Меня все время сбивало, что это штука для удаленной установки, но нет, она позволяет ставить и пакеты.

Синхронизировать с Яндекс.Диском папку которая лежит в произвольном месте

Собственно, проблема следующая. На компьютере установлен упомянутый Яндекс.Диск. Он смаплен в какую то папку. И все великолепно с ней синхронизирует. Но, стоит задача синхронизировать в облако еще и сетевую папку доступную на этом компьютере. В принципе, можно при помощи сторонних программ настроить синхронизацию этой сетевой папки с папкой в Яндекс.Диске. Но это дополнительные программы, да и зачем мне копия на локальном компьютере сетевой папки?
Данная задача решается достаточно просто командой MKLINK. Синтаксис достаточно прост. Имя команды, ключ /D, имя ярлыка, папка которую нужно смапить.
Вот на примере локальной папки:
MKLINK /D C:UsershomeYandexDiskTestFolder d:TestFolder
Все, спокойно работаем с папкой, а она автоматом синхронизируется в облако, т.к. все программы считают этот ярлык самой папкой.