Окружающая среда:
- 64-битная Windows
- ~ 50 ГБ ОЗУ
- .NET 3.5 SP1
- 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,
Кодировка кодирования, Boolean isPlp,
TdsParserStateObject stateObj)
в System.Data.SqlClient.TdsParser.ReadSqlValue (SqlBuffer
значение, SqlMetaDataPriv md, Int32
длина, TdsParserStateObject stateObj)
в System.Data.SqlClient.SqlDataReader.ReadColumnData ()
в System.Data.SqlClient.SqlDataReader.ReadColumn (Int32
я, логическое setTimeout)
...
В своем эксперименте я определил, что строка .NET может содержать (в точности) 1 073 741 794 символа, поэтому значение этого столбца удобно ниже этого значения.
Любые идеи о том, как это OOM может происходить ?? Спасибо