【问题标题】:64-bit OutOfMemoryException with SqlDataAdapter带有 SqlDataAdapter 的 64 位 OutOfMemoryException
【发布时间】:2011-04-19 15:17:49
【问题描述】:

环境是:

  • 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 长度, 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 是如何发生的任何想法?谢谢

【问题讨论】:

    标签: .net-3.5 64-bit out-of-memory sqldataadapter


    【解决方案1】:

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

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

    【讨论】:

    • 点了,但这并不能回答我的问题。 1.5GB 仍然远小于 2GB。
    • 没错。实际最大值将略小于绝对最大值。在你的情况下,这大约是 1.5GB 标记
    猜你喜欢
    • 2014-06-06
    • 2013-01-28
    • 2017-12-28
    • 2013-09-13
    • 2018-06-14
    • 1970-01-01
    • 2017-08-03
    • 1970-01-01
    • 2010-10-11
    相关资源
    最近更新 更多