64-битное исключение OutOfMemory с SqlDataAdapter - PullRequest
0 голосов
/ 01 октября 2010

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

  • 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 может происходить ?? Спасибо

1 Ответ

0 голосов
/ 01 октября 2010

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

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

...