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

取得される単一の行は、最大 7 億 5000 万文字/最大 1.5 GB のテキストです。

部分的なスタック トレースを次に示します。

System.OutOfMemoryException: タイプ 'System.OutOfMemoryException' の例外がスローされました。

System.Data.SqlClient.TdsParser.ReadPlpUnicodeChars (Char[]& buff、Int32 offst、Int32 len、TdsParserStateObject stateObj)
で System.Data.SqlClient.TdsParser.ReadSqlStringValue (SqlBuffer 値、バイト型、Int32 長さ、エンコーディング エンコーディング、ブール値) System.Data.SqlClient.SqlDataReader.ReadColumn で System.Data.SqlClient.SqlDataReader.ReadColumnData( ) で
System.Data.SqlClient.TdsParser.ReadSqlValue(SqlBuffer 値、SqlMetaDataPriv md、Int32 長さ、TdsParserStateObject stateObj)
で isPlp、TdsParserStateObject stateObj)
(Int32 i, Boolean setTimeout) ...

私の実験では、.NET 文字列が (正確に) 1,073,741,794 文字を保持できると判断したため、この列の値はそれより十分小さくなっています。

このOOMがどのように発生するかについてのアイデアはありますか?? ありがとう

4

1 に答える 1

0

50 GBの物理メモリがあり、64 ビット OS を使用している場合でも、1 つの .NET オブジェクトの最大サイズは依然として2 GBです。

おそらく、1.5GB 以上の XML BLOB を割り当てることが本当に良い考えかどうかを検討する必要があります...(実際にそうなることはめったにありません)

于 2010-10-01T00:46:29.133 に答える