Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Освободить память после загрузки "больших" таблиц

53K
15 ноября 2009 года
AcNoD
3 / / 15.11.2009
Есть таблица (около 2.5 млн записей)... Посредством метода Fill DataAdapter'a из SQL сервера в датасет льем данные из таблицы. Затем DataGridView.DataSource = dataSet. Загрузка подобных таблиц естественно съедает ресурсы в моем случае до ~1GB утрированно. Есть ли способ вернуть программе эту память после того как работа с таблицей закончилась??????

Для теста на всех используемых объектах (в том числе и для DataGridView) вызываю Dispose. А затем
 
Код:
GC.Collect()
GC.WaitForPendingFinalizers()
GC.Collect()

но сборщик только освобождает лишь часть памяти, ничтожную по сравнению с той, что занимает таблица.... в проге пользователь может открывать до неск. десятков подобных таблиц
Есть ли способ вернуть занятую таблицей память для повторного использования для загрузки других таблиц.
5
15 ноября 2009 года
hardcase
4.5K / / 09.08.2005
Цитата: AcNoD
Есть ли способ вернуть занятую таблицей память для повторного использования для загрузки других таблиц.


Вы уверены, что пользователю действительно нужны все 2.5 млн строк? :eek:

53K
15 ноября 2009 года
AcNoD
3 / / 15.11.2009
Цитата: hardcase
Вы уверены, что пользователю действительно нужны все 2.5 млн строк? :eek:



Предполагал такой вопрос:
возможность загружать данные частями, не рассматривается, потому что суть проги - искать "кривые" записи в таблице, а в DataGridView удобно для пользователя просматривать их все, и пользователь должен свободно перемещаться по набору и принимать решения об удалении и некоторых диапазонов строк, т.е. програ перемещает пользователя на диапазон в котором найдена ошибка, и он принимает решение об удалении этого диапазона или его правке и т.д.

Можно конечно делать загрузку по частям но:
1) это неудобно,
2) все равно нужно просмотреть весь диапазон
3) исходная проблема освобождения ресурса все равно останется

5
16 ноября 2009 года
hardcase
4.5K / / 09.08.2005
Цитата: AcNoD
суть проги - искать "кривые" записи в таблице

Почему нельзя этого сделать на сервере?



Цитата: AcNoD
DataGridView удобно для пользователя просматривать их все

Пользователю уже затруднительно прокручивать более 100 записей в DataGridView.

Цитата: AcNoD
и пользователь должен свободно перемещаться по набору и принимать решения об удалении и некоторых диапазонов строк, т.е. програ перемещает пользователя на диапазон в котором найдена ошибка, и он принимает решение об удалении этого диапазона или его правке и т.д.

Почему бы не показывать именно этот диапазон?

Цитата: AcNoD
Можно конечно делать загрузку по частям но:
1) это неудобно,

Неудобно штаны через голову надевать. Согласитесь, что вам просто лень.

Цитата: AcNoD
2) все равно нужно просмотреть весь диапазон

По мере подкачки одних данных, уже доступные данные могут анализироваться. Таким образом получаем ускорение работы.

Цитата: AcNoD
3) исходная проблема освобождения ресурса все равно останется

Мой вам совет. Откажитесь от датасетов совсем. Используйте, например, стандартную коллекцию .NET - List<T>, где T - класс, представляющий строку в вашей таблице. Вам же будет проще анализ проводить, загрузка будет быстрее, да и памяти использоваться будет значительно меньше.



З.Ы. По поводу исходного вопроса. У вас наверняка остаются ссылки на датасет, вроде той, что находится в DataGridView.DataSource, ее нужно обязательно сбрасывать на null.

53K
16 ноября 2009 года
AcNoD
3 / / 15.11.2009
Цитата: hardcase

З.Ы. По поводу исходного вопроса. У вас наверняка остаются ссылки на датасет, вроде той, что находится в DataGridView.DataSource, ее нужно обязательно сбрасывать на null.



ок. попробую DataGridView.DataSource = Nothing перед вызовом Dispose для Dataset

Цитата: hardcase

Мой вам совет. Откажитесь от датасетов совсем. Используйте, например, стандартную коллекцию .NET - List<T>, где T - класс, представляющий строку в вашей таблице. Вам же будет проще анализ проводить, загрузка будет быстрее, да и памяти использоваться будет значительно меньше.



Хорошая идея. Спасибо! обязательно реализую, но только после того как логика приведения таблицы из сырого вида к требуемому будет выверена, в таком случае данные вообще не нужно будет предоставлять пользователю для просомотра... а пока алгоритм отлаживается, пользователь должен по возможности "местами" хотябы просматривать предстоящие изменения, которые внесет прога

Все остальные замечания тоже учту :-[

и еще вопросик:

Цитата: hardcase

Почему нельзя этого сделать на сервере?


в двух словах, что здесь имеется ввиду?

5
16 ноября 2009 года
hardcase
4.5K / / 09.08.2005
Цитата: AcNoD
в двух словах, что здесь имеется ввиду?


Конечно, зависит от алгоритма поиска несоответствий, но для таких больших объемов данных было бы разумнее не перегонять всю таблицу на клиента, а производить поиск на сервере, клиенту же отдавать "подозрительные" данные.

241
18 ноября 2009 года
Sanila_san
1.6K / / 07.06.2005
Иначе говоря, если к кривым записям не относятся порнокартинки (они плохо поддаются машинному распознаванию), то для определения кривизны записи существует какой-то объективный критерий. Его-то и нужно использовать при выборке данных, например, в SQL-запросе.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог