Освободить память после загрузки "больших" таблиц
Для теста на всех используемых объектах (в том числе и для DataGridView) вызываю Dispose. А затем
GC.WaitForPendingFinalizers()
GC.Collect()
но сборщик только освобождает лишь часть памяти, ничтожную по сравнению с той, что занимает таблица.... в проге пользователь может открывать до неск. десятков подобных таблиц
Есть ли способ вернуть занятую таблицей память для повторного использования для загрузки других таблиц.
Вы уверены, что пользователю действительно нужны все 2.5 млн строк? :eek:
Предполагал такой вопрос:
возможность загружать данные частями, не рассматривается, потому что суть проги - искать "кривые" записи в таблице, а в DataGridView удобно для пользователя просматривать их все, и пользователь должен свободно перемещаться по набору и принимать решения об удалении и некоторых диапазонов строк, т.е. програ перемещает пользователя на диапазон в котором найдена ошибка, и он принимает решение об удалении этого диапазона или его правке и т.д.
Можно конечно делать загрузку по частям но:
1) это неудобно,
2) все равно нужно просмотреть весь диапазон
3) исходная проблема освобождения ресурса все равно останется
Почему нельзя этого сделать на сервере?
Пользователю уже затруднительно прокручивать более 100 записей в DataGridView.
Почему бы не показывать именно этот диапазон?
1) это неудобно,
Неудобно штаны через голову надевать. Согласитесь, что вам просто лень.
По мере подкачки одних данных, уже доступные данные могут анализироваться. Таким образом получаем ускорение работы.
Мой вам совет. Откажитесь от датасетов совсем. Используйте, например, стандартную коллекцию .NET - List<T>, где T - класс, представляющий строку в вашей таблице. Вам же будет проще анализ проводить, загрузка будет быстрее, да и памяти использоваться будет значительно меньше.
З.Ы. По поводу исходного вопроса. У вас наверняка остаются ссылки на датасет, вроде той, что находится в DataGridView.DataSource, ее нужно обязательно сбрасывать на null.
З.Ы. По поводу исходного вопроса. У вас наверняка остаются ссылки на датасет, вроде той, что находится в DataGridView.DataSource, ее нужно обязательно сбрасывать на null.
ок. попробую DataGridView.DataSource = Nothing перед вызовом Dispose для Dataset
Мой вам совет. Откажитесь от датасетов совсем. Используйте, например, стандартную коллекцию .NET - List<T>, где T - класс, представляющий строку в вашей таблице. Вам же будет проще анализ проводить, загрузка будет быстрее, да и памяти использоваться будет значительно меньше.
Хорошая идея. Спасибо! обязательно реализую, но только после того как логика приведения таблицы из сырого вида к требуемому будет выверена, в таком случае данные вообще не нужно будет предоставлять пользователю для просомотра... а пока алгоритм отлаживается, пользователь должен по возможности "местами" хотябы просматривать предстоящие изменения, которые внесет прога
Все остальные замечания тоже учту :-[
и еще вопросик:
Почему нельзя этого сделать на сервере?
в двух словах, что здесь имеется ввиду?
Конечно, зависит от алгоритма поиска несоответствий, но для таких больших объемов данных было бы разумнее не перегонять всю таблицу на клиента, а производить поиск на сервере, клиенту же отдавать "подозрительные" данные.