0

环境是:

  • 64 位 Windows
  • ~50GB 内存
  • .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

正在检索的单行是 ~750M 个字符/~1.5GB 的文本。

这是部分堆栈跟踪:

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 长度, TdsParserStateObject stateObj)
在 System.Data.SqlClient.SqlDataReader.ReadColumnData()
在 System.Data.SqlClient.SqlDataReader.ReadColumn (Int32 i, 布尔 setTimeout) ...

在我的实验中,我确定了一个 .NET 字符串可以容纳(确切地说)1,073,741,794 个字符,因此该列的值低于该值。

关于这个OOM如何发生的任何想法?谢谢

4

1 回答 1

0

即使您有 50GB 物理内存并使用 64 位操作系统,单个 .NET 对象的最大大小仍然是2GB

也许您应该考虑分配 1.5GB+ XML blob 是否真的是一个好主意...(很少这样)

于 2010-10-01T00:46:29.133 回答