c# - 为什么逐行匹配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 的每一行中循环和搜索匹配项的过程会导致更大的内存消耗。
我对内存管理相当陌生,因此希望能提供一些资源参考来解释这一点。
解决方案
对于每一行,您都在调用整个 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;
}
推荐阅读
- powershell - 通过 PowerShell 从远程计算机上的服务器执行卸载设置
- python - python:如何首先根据值(可以为空/无/真/假)然后基于键对字典进行排序
- python - 使用 python3 在 pipenv 中设置 awscli
- java - 如何解决此“应用程序启动方法中的异常”
- amazon-web-services - 一次不能调用超过 64 个 Lambda 函数?
- php - 如何从没有免费主题的默认 wordpress 内核中删除弹出广告
- r - 在R中制作箱形图?
- python - django spotify api python http post 500 错误
- php - 通过 href 方法将复选框的值发送到 control.php 文件
- python - tkinter 按钮在 while 循环中,不使用主循环:它如何以固定间隔工作?