首页 > 解决方案 > 为什么逐行匹配datagridview中的列值会消耗大量内存?

问题描述

我有一个DataGridview名为的对象dgv,它的DataSource属性设置为一个BindingSource对象,该对象又指向一个DataTable名为ds.DataTable1. DataTable1有一个Name专栏。

首先,我让它加载 700,000 个完全填充的行tableAdapter.Fill(ds.dataTable1)。然后我使用 for 循环运行搜索,如下所示:

int rowCount = dgv.Rows.Count;
string searchName = "zelda";
// Search next record
for (int i = 0; i < rowCount; i++)
{
    if (dgv.Rows[i].Cells[column1.Name].Value.ToString() == searchName.ToUpper())
    {
        break;
    }
}

我意识到此搜索使用的内存量超过Fill了数据集中使用的内存量。为了说明,当我初始化应用程序时,它只消耗大约 50 MB。当我Fill数据集时,内存消耗达到 600 MB。当我运行搜索时,内存使用量在遇到内存不足错误之前达到了 1.5 GB,因为我的应用程序是 32 位的。

我发现这条线

if (dgv.Rows[i].Cells[column1.Name].Value.ToString() == searchName.ToUpper())

是罪魁祸首。

知道为什么数十万次调用这条线会消耗如此大量的内存吗?我知道这个 datagridview 会消耗大量内存,因为它需要保存大量数据,但并不真正理解为什么在 DataGridview 的每一行中循环和搜索匹配项的过程会导致更大的内存消耗。

我对内存管理相当陌生,因此希望能提供一些资源参考来解释这一点。

标签: c#datagridview

解决方案


对于每一行,您都在调用整个 datagridview 中的整行,而您只需要一列。

您可以通过制作一个仅包含您正在搜索的列的列表来缩短通话时间。也许将 dgv 变成一列会花费更少的内存,然后再检查它的值。

此查询可以帮助您仅接收列值:

List<string> columnvalues = new List<string>();
foreach (DataGridViewRow row in dataGridView1.Rows)
{
    columnvalues.Add(row.Cells[column1.Name].Value.ToString());
}

if (columnvalues.Contains(searchName.ToUpper())
{
    break;
}

来源:https ://stackoverflow.com/a/21314241/2735344


推荐阅读