从数据表读取数据时减少内存使用量

Uth*_*aj. 4 c# wpf datatable memory-management

我试过这种方式从数据表读取数据是否还有其他更好的方法来存储列表中的数据(以减少内存使用).

代码:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

Tim*_*ter 5

你确定你的记忆问题是由DataTable?引起的吗?您将所有映射到自定义类,每行都有一个字典.所以你需要的记忆力是DataTable单独记忆的两倍多.

但是,如果您正在读取数据库中的值,并且您DataTable要将所有值都加载到第一个只是为了能够循环所有以使用字典创建自定义类,那么在内存消耗方面有更好的方法:

  • 使用a DataReader从数据库中读取这些值.无需在内存中存储任何内容即可流式传输数据

    var list = new List<Myclassdef>();
    using (var con = new SqlConnection(Settings.Default.ConnectionString))
    {
        using (var cmd = new SqlCommand("SELECT ... WHERE Col1=@param1", 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);
                }
            }
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)