2012-01-20 89 views
0

我在本地磁盤上有一個很大的XML文件(150mb範圍),並使用ADO.NET將它放入一個nvarchar(max)列。該代碼看起來是這樣的(大量編輯這樣的東西只留下代碼的相關部分):帶SQL XML的OutOfMemoryException插入

using (var fileStream = new FileStream(myfile , FileMode.Open , FileAccess.Read , FileShare.Read)) 
{ 
// prep sqlconnection... 
sqlCon.Open(); 
var sqlCommand = new SqlCommand();  
sqlCommand.Connection = sqlCon; 
sqlCommand.CommandType = CommandType.StoredProcedure; 
sqlCommand.CommandText = "[dbo].[bigsproc]"; 
var param1 = new SqlParameter("@doc" , SqlDbType.NVarChar , Int32.MaxValue); 
param1.Value = new SqlXml(fileStream); 
sqlCommand.Parameters.Add(param1); 
var syncResult = sqlCommand.ExecuteNonQuery(); 

我得到這個問題:

ExceptionBody:System.OutOfMemoryException: Exception of type 'System.OutOfMemoryException' was thrown. 
    at System.IO.MemoryStream.set_Capacity(Int32 value) 
    at System.IO.MemoryStream.EnsureCapacity(Int32 value) 
    at System.IO.MemoryStream.Write(Byte[] buffer, Int32 offset, Int32 count) 
    at System.Xml.XmlEncodedRawTextWriter.EncodeChars(Int32 startOffset, Int32 endOffset, Boolean writeAllToStream) 
    at System.Xml.XmlEncodedRawTextWriter.FlushBuffer() 
    at System.Xml.XmlEncodedRawTextWriter.RawText(Char* pSrcBegin, Char* pSrcEnd) 
    at System.Xml.XmlEncodedRawTextWriter.RawText(String s) 
    at System.Xml.XmlEncodedRawTextWriter.WriteStartElement(String prefix, String localName, String ns) 
    at System.Xml.XmlWellFormedWriter.WriteStartElement(String prefix, String localName, String ns) 
    at System.Xml.XmlWriter.WriteNode(XmlReader reader, Boolean defattr) 
    at System.Data.SqlTypes.SqlXml.CreateMemoryStreamFromXmlReader(XmlReader reader) 
    at System.Data.SqlTypes.SqlXml..ctor(XmlReader value) 
    at System.Data.SqlClient.SqlParameter.CoerceValue(Object value, MetaType destinationType) 
    at System.Data.SqlClient.SqlParameter.GetCoercedValue() 
    at System.Data.SqlClient.SqlParameter.Validate(Int32 index, Boolean isCommandProc) 
    at System.Data.SqlClient.SqlCommand.SetUpRPCParameters(_SqlRPC rpc, Int32 startCount, Boolean inSchema, SqlParameterCollection parameters) 
    at System.Data.SqlClient.SqlCommand.BuildRPC(Boolean inSchema, SqlParameterCollection parameters, _SqlRPC& rpc) 
    at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async) 
    at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result) 
    at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult result, String methodName, Boolean sendToPipe) 
    at System.Data.SqlClient.SqlCommand.ExecuteNonQuery() 

是什麼讓這個大圓盤的最佳方式基於XML的遠程數據庫服務器?

謝謝。

+2

您的xml文件有多大? – dash

+0

文件是150MB。這個問題不僅僅是一個文件,但是當使用多個.NET任務(線程)執行時,有幾個可能會同時運行,導致CLR可用內存耗盡。謝謝。 – Snowy

+0

當我將大型XML文件保存到數據庫中時,我使用二進制數據類型並首先對它們進行壓縮 - 令人驚訝的是壓縮文件與未壓縮的XML相比有多小。在檢索時,我簡單地解壓縮XML並將其交付給客戶端。如果你喜歡,可以提供樣品嗎?您的替代方案可能會排列請求;所以你一次只能執行一次保存。也可能能夠流式傳輸Xml,一次限制內存量。 – dash

回答

0

當對象不像處理類似如果您看到 SQL連接對象不在使用語句+ SqlCommand類也是IDisposable時發生內存超出異常。

這可能不是每次都會發生內存溢出崩潰。但是當內存溢出時,問題肯定會發生......