2013-07-30 53 views
4

我試過這種方法從數據表中讀取數據,還有其他更好的方法來將數據存儲在列表中(以減少內存使用量)。從數據表中讀取數據時減少內存使用量

代碼:

foreach (System.Data.DataRow row in table.Rows) 
{ 
    Myclassdef data = new Myclassdef(); 
    data.Data = new Dictionary<string, object>(); 

    foreach (DataColumn columninfo in table.Columns) 
    { 
     object value = row[columninfo.ColumnName]; 
     Myclassdef.Data.Add(columninfo.ColumnName, value); 
    } 
} 
+0

什麼你確定你的內存問題是由'DataTable'造成的數據?您將全部映射到每個行都帶有字典的自定義類中。所以你需要的內存比單獨使用DataTable多兩倍。爲什麼不使用'DataReader'從數據庫中讀取這些值?這種數據流不需要在內存中存儲任何內容。 –

+0

@TimSchmelter如何避免超過兩次內存使用 – Ragavan

+0

@Smith:如果數據源是數據庫,請使用下面的'DataReader'方法。然後,「Myclassdef」實例與他們的字典是唯一的內存消費者。 –

回答

5

你確定你的內存問題是由DataTable引起的嗎?您將全部映射到每個行都帶有字典的自定義類中。所以你需要的內存比單獨使用DataTable多兩倍。

但是,如果您正在讀取數據庫中的值,並且您首先要將所有內容加載到DataTable中,那麼只需要循環全部以便使用字典創建自定義類,那麼就內存消耗而言有更好的方法:

  • 使用DataReader從數據庫讀取這些值。那流而無需在內存中存儲

    var list = new List<Myclassdef>(); 
    using (var con = new SqlConnection(Settings.Default.ConnectionString)) 
    { 
        using (var cmd = new SqlCommand("SELECT ... WHERE [email protected]", con)) 
        { 
         cmd.Parameters.AddWithValue("@param1", "value1"); 
         // ... 
         con.Open(); 
         using (var reader = cmd.ExecuteReader()) 
         { 
          while (reader.Read()) 
          { 
           Myclassdef data = new Myclassdef(); 
           data.Data = new Dictionary<string, object>(); 
           for (int i = 0; i < reader.FieldCount; i++) 
           { 
            data.Data.Add(reader.GetName(i), reader[i]); 
           } 
           list.Add(data); 
          } 
         } 
        } 
    } 
    
+0

完美,謝謝你的答案 – Ragavan

+0

是否發生任何錯誤或任何事情,如果超過用戶在同一時間訪問數據庫 – Ragavan

3

你是問,如果有一個更好的辦法,還是你問,如果有一個更高效的內存存儲選項?

我非常懷疑任何其他內存存儲選項會給你一個明顯的區別。列表和字典可能不是最有效的存儲選項,但它們也不是豬。

如果你想知道是否有更好的方法取決於你想要做什麼。如果要向用戶顯示該數據,通常所做的是計算表格的可見尺寸(以便滾動條的行爲與預期相同),並且只有剛好在觀看區域之外的前一個和下一個記錄中的一些被緩存。當用戶四處移動查看錶格時,數據將根據需要進行延遲加載。