Out of memory при выполнении кода в Assembly.
От: blonduser  
Дата: 07.11.14 05:13
Оценка:
Всем доброго времени суток!

Есть MS SQL-Server 2008.
Создана Assembly на C#.
При вызове функции
Text = File.ReadAllText(FileName, Encoding.Unicode);

Возникает ошибка при загрузке больших файлов больше 16 Мбайт

.NET Framework execution was aborted by escalation policy because of out of memory.
System.Threading.ThreadAbortException: Поток находился в процессе прерывания.
System.Threading.ThreadAbortException:
в System.String.GetStringForStringBuilder(String value, Int32 startIndex, Int32 length, Int32 capacity)
в System.Text.StringBuilder.GetNewString(String currentString, Int32 requiredLength)
в System.Text.StringBuilder.Append(Char[] value, Int32 startIndex, Int32 charCount)
в System.IO.StreamReader.ReadToEnd()
в System.IO.File.ReadAllText(String path, Encoding encoding)


Для примера сделал вызов функции из обычного приложения.
Файл загрузился без проблем.

В команде создания Assembly не нашел никаких параметров управления памятью.

Может есть какие-то ограничения? Как их изменить?

Спасибо.
Re: Out of memory при выполнении кода в Assembly.
От: rm822 Россия  
Дата: 07.11.14 07:46
Оценка: 118 (3)
B>Может есть какие-то ограничения? Как их изменить?
Насколько мне известно нет никаких ограничений.

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

в 2012м аллокатор для bpool'а и для CLR — уже общий.

По хорошему, надо бы отказаться от использования 32 битных сиквелов, ибо это глупость уже очень давно
Но можно и поиграться с костылями, есть такой параметр -g который как раз отбирает VAS у bpool'а

пара линков
http://blogs.msdn.com/b/sqlclr/archive/2006/03/24/560154.aspx
http://msdn.microsoft.com/en-us/library/ms190737.aspx
sql clr memory
Re[2]: Out of memory при выполнении кода в Assembly.
От: blonduser  
Дата: 07.11.14 08:25
Оценка:
Здравствуйте, rm822, Вы писали:

B>>Может есть какие-то ограничения? Как их изменить?

R>Насколько мне известно нет никаких ограничений.

R>2005 2008й сиквелы для CLR не используют аллокации из буферного пула (CLR там прикручен сбоку по сути)

R>поэтому если у тебя 32битный сиквел и базы больше пары гигабайт, то все VAS будет сожрано буферным пулом и CLR-у ничего не останется.

R>в 2012м аллокатор для bpool'а и для CLR — уже общий.


R>По хорошему, надо бы отказаться от использования 32 битных сиквелов, ибо это глупость уже очень давно

R>Но можно и поиграться с костылями, есть такой параметр -g который как раз отбирает VAS у bpool'а

R>пара линков

R>http://blogs.msdn.com/b/sqlclr/archive/2006/03/24/560154.aspx
R>http://msdn.microsoft.com/en-us/library/ms190737.aspx

Спасибо параметр -g помог.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.