2013-01-15 27 views
-3

我不得不從分貝讀大量BLOB數據(更然後300GB)並插入到另一個db.I正在通過使用以下代碼如何以及何時在C#中處理對象?

if (dr.HasRows) 
{ 
    while (dr.Read()) 
    { 
     media m = new media 
     { 
      docid = Convert.ToInt32(dr["Id"]), 
      Content = Convert.ToByte(dr["BlobData"]), 
      madiaName = Convert.ToString(dr["Name"]) 
     } 
    } 

    InsertInNewDb(m); 
} 

我逐行讀取並插入數據在讀取數據asnother db.The問題是內存完整的異常後發送一些數據生成,因爲我不處置對象。 如何在單次迭代後處理對象?

+2

「我要讀大量的BLOB數據(更多然後300GB)」 - 嗯,WTF!你將不得不緩衝和讀取塊...最大的單個.NET對象是2GB。 –

+2

處理不是問題,除非你有300GB的內存,你不能在內存中讀取那麼多。 –

+1

處理對象與內存無關。它與釋放非託管資源(如文件句柄)有關。 –

回答

1

爲了配合一些答案和評論在一起,嘗試這樣的:

// The SqlConnection, SqlCommand and SqlDataReader need to be in using blocks 
// so that they are disposed in a timely manner. This does not clean up 
// memory, it cleans up unmanaged resources like handles 
using (SqlConnection conn = new SqlConnection(connectionString)) 
{ 
    using (SqlCommand cmd = new SqlCommand("SELECT * FROM OldTable", conn)) 
    { 
     using (SqlDataReader dr = cmd.ExecuteReader()) 
     { 
      if (dr.HasRows) 
      { 
       while (dr.Read()) 
       { 
        media m = new media 
        { 
         // Don't convert - cast instead. These are already the correct 
         // type. 
         docid = (int) dr["Id"], 
         // There are more efficient ways to do this, but 
         // Convert.ToByte was copying only a single byte 
         Content = dr["BlobData"], 
         madiaName = (string)dr["Name"] 
        } 

        // You probably want to insert _all_ of the rows. 
        // Your code was only inserting the last 
        InsertInNewDb(m); 
       } 
      } 
     } 
    } 
} 
0

你可以嘗試分頁的DataReader,這應該工作。試着在一些行之後關閉數據的源和目標。請記住使用的對象,使用指令更好地管理內存。

+0

如何在使用語句中使用對象?它表明一個類應該是無可比擬的 – mck

+0

對不起,我的意思是連接對象,命令和數據記錄器等。 – hesenger

+0

他的對象應該實現IDosposable以與'using'塊一起使用。 – dotNETbeginner

相關問題