【问题标题】:Reduce memory usage while read data from datatable从数据表中读取数据时减少内存使用量
【发布时间】:2013-07-30 07:41:27
【问题描述】:

我已经尝试过这种方式从数据表中读取数据,还有其他更好的方法可以将数据存储在列表中(以减少内存使用)。

代码:

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);
    }
}

【问题讨论】:

  • 你确定你的内存问题是由DataTable引起的吗?您正在将所有内容映射到一个自定义类,其中每一行都有一个字典。所以你需要的内存是单独使用DataTable 的两倍多。为什么不使用DataReader 从数据库中读取这些值?无需在内存中存储任何内容即可流式传输数据。
  • @TimSchmelter 如何避免将内存翻倍
  • @Smith:如果数据源是数据库,请使用下面我的DataReader 方法。那么Myclassdef 实例及其字典是唯一的内存消费者。
  • @TimSchmelter : 如果多个用户同时访问数据库,是否会发生任何错误或任何问题

标签: c# wpf memory-management datatable


【解决方案1】:

您确定您的内存问题是由DataTable 引起的吗?您正在将所有内容映射到一个自定义类,其中每一行都有一个字典。所以你需要的内存是单独使用DataTable 的两倍多。

但是,如果您从数据库中读取值并且首先将所有值加载到 DataTable 中,以便能够循环所有内容以使用字典创建自定义类,那么在内存方面有更好的方法消费:

  • 使用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);
                }
            }
        }
    }
    

【讨论】:

  • 如果多个用户同时访问数据库,是否出现错误或任何问题
【解决方案2】:

您是在问是否有更好的方法,还是在问是否有更高效的内存存储选项?

我非常怀疑任何其他内存存储选项会给您带来明显的不同。列表和字典可能不是最有效的存储选项,但它们也不是猪。

如果您想知道是否有更好的方法取决于您要执行的操作。如果要向用户显示此数据,通常要做的是计算表的可见大小(以便滚动条按预期运行),并且仅缓存刚刚超出查看区域的一些前一个和下一个记录.当用户四处移动查看表格时,数据会根据需要延迟加载。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多