64 位 SqlDataAdapter 出现 OutOfMemoryException

发布于 2024-09-25 19:15:18 字数 1238 浏览 8 评论 0原文

环境是:

  • 64 位 Windows
  • ~50GB RAM
  • .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 值、Byte 类型、Int32 长度、 Encoding编码,布尔值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,布尔设置超时) ...

在我的实验中,我确定 .NET 字符串可以(恰好)容纳 1,073,741,794 个字符,因此该列值明显低于该值。

关于 OOM 如何发生有什么想法吗?谢谢

The environment is:

  • 64-bit Windows
  • ~50GB RAM
  • .NET 3.5 SP1
  • SQL 2008

The code is (essentially, from memory):

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

The single row that's being retrieved is ~750M characters/~1.5GB of text.

Here's a partial stack trace:

System.OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown.

at System.Data.SqlClient.TdsParser.ReadPlpUnicodeChars(Char[]& buff, Int32 offst,
Int32 len,
TdsParserStateObject stateObj)

at System.Data.SqlClient.TdsParser.ReadSqlStringValue(SqlBuffer
value, Byte type, Int32 length,
Encoding encoding, Boolean isPlp,
TdsParserStateObject stateObj)

at System.Data.SqlClient.TdsParser.ReadSqlValue(SqlBuffer
value, SqlMetaDataPriv md, Int32
length, TdsParserStateObject stateObj)

at System.Data.SqlClient.SqlDataReader.ReadColumnData()

at System.Data.SqlClient.SqlDataReader.ReadColumn(Int32
i, Boolean setTimeout)
...

In my experimenting, I've determined a .NET string can hold (exactly) 1,073,741,794 characters, so this column value is comfortably below that.

Any ideas on how this OOM can be happening ?? Thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

烟酉 2024-10-02 19:15:18

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

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

Even though you have 50GB physical memory and using 64 bit OS, the maximum size of a single .NET object is still 2GB.

Perhaps you should consider whether allocating a 1.5GB+ XML blob is really a good idea...(it rarely is)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文