64-битное исключение OutOfMemoryException с SqlDataAdapter

Окружающая среда:

  • 64-битная Windows
  • ~ 50 ГБ ОЗУ
  • .NET 3.5 с пакетом обновления 1
  • SQL 2008

Код (по сути, по памяти):

System.Data.DataTable table = new System.Data.DataTable();
SqlCommand command = new SqlCommand("SELECT XmlColumn FROM Table WHERE ID = UniqueID", Connection);
SqlDataAdapter adapter = new SqlDataAdapter(command);

adapter.Fill(table); // OOM here

Извлекаемая строка содержит ~750 млн символов/~1,5 ГБ текста.

Вот частичная трассировка стека:

System.OutOfMemoryException: возникло исключение типа «System.OutOfMemoryException».

в System.Data.SqlClient.TdsParser.ReadPlpUnicodeChars(Char[]& buff, Int32 offst, Int32 len, TdsParserStateObject stateObj)
в System.Data.SqlClient.TdsParser.ReadSqlStringValue (значение SqlBuffer, тип байта, длина Int32, кодировка кодировки, логическое значение isPlp, TdsParserStateObject stateObj)
в System.Data.SqlClient.TdsParser.ReadSqlValue (значение SqlBuffer, SqlMetaDataPriv md, Int32 length, TdsParserStateObject stateObj)
в System.Data.SqlClient.SqlDataReader.ReadColumnData()
в System.Data.SqlClient.SqlDataReader.ReadColumn(Int32 i, Boolean setTimeout) ...

В своих экспериментах я определил, что строка .NET может содержать (ровно) 1 073 741 794 символа, поэтому значение этого столбца удобно ниже этого значения.

Любые идеи о том, как это OOM может происходить ?? Спасибо


person Chris    schedule 01.10.2010    source источник


Ответы (1)


Несмотря на то, что у вас есть 50 ГБ физической памяти и вы используете 64-разрядную ОС, максимальный размер одного объекта .NET по-прежнему составляет 2 ГБ.

Возможно, вам следует подумать, действительно ли выделение большого двоичного объекта XML объемом 1,5 ГБ и более является хорошей идеей... (это редко бывает)

person Mitch Wheat    schedule 01.10.2010
comment
Точка принята, но это не отвечает на мой вопрос. 1,5 ГБ все еще намного меньше, чем 2 ГБ. - person Chris; 01.10.2010
comment
Вот так. Фактический максимум будет несколько меньше абсолютного максимума. В вашем случае это около 1,5 ГБ. - person Mitch Wheat; 01.10.2010