Окружающая среда:
- 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 может происходить ?? Спасибо