Почему сопоставление значения столбца в datagridview строка за строкой потребляет много памяти? - PullRequest
1 голос
/ 13 июля 2020

У меня есть объект DataGridview с именем dgv, в результате чего его свойство DataSource установлено на объект BindingSource, который, в свою очередь, указывает на объект DataTable с именем ds.DataTable1. DataTable1 имеет столбец Name.

Во-первых, я загрузил 700 000 полностью заполненных строк, используя tableAdapter.Fill(ds.dataTable1). Затем я запускаю поиск, используя for-l oop, например:

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 МБ. Когда я Fill набор данных, потребление памяти достигает 600 МБ. Когда я запускаю поиск, использование памяти достигло 1,5 ГБ, прежде чем возникла ошибка нехватки памяти, поскольку мое приложение является 32-разрядным.

Я обнаружил, что эта строка

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

виноват.

Есть идеи, почему вызов этой строки в течение сотен тысяч раз потребляет такой большой объем памяти? Я понимаю, что этот datagridview потребляет много памяти, поскольку он должен хранить большой объем данных, но не совсем понимаю, почему процесс зацикливания и поиска совпадения в каждой строке в DataGridview вызывает еще большее потребление памяти.

Я новичок в управлении памятью, поэтому был бы признателен за ссылки на ресурсы, которые объясняют это.

1 Ответ

0 голосов
/ 13 июля 2020

Для каждой строки вы вызываете полную строку во всем 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;
}

Источник: { ссылка }

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...