Member 14119435 Ответов: 1

Как реализовать память об используемых данных из базы данных в памяти ?


Всем привет. у меня проблема
у меня есть база данных с 1 млн записей.
я хочу получать данные из базы данных в памяти каждую тысячу записей по ADO.NET и сделай мне операцию
затем отпустите память и извлеките следующую запись тысячи и снова ...
освобождает ли GC память в этом состоянии?

Что я уже пробовал:

SqlCommand cmd = new SqlCommand();
            cmd.Connection = con;
            cmd.CommandText = "select * from Base";
            DataSet dataSet = new DataSet();
            SqlDataAdapter adapter = new SqlDataAdapter(cmd);
            adapter.Fill(dataSet, "Record");

F-ES Sitecore

.net обрабатывает управление памятью за вас, и вы мало что можете сделать, чтобы освободить память самостоятельно. Вы можете погуглить "gc.collect", чтобы узнать, как спровоцировать сбор памяти. Если вы просматриваете много данных, то вам нужно будет пролистать их или использовать что-то вроде datareader, а не заполнять набор данных, поскольку это позволит вам обрабатывать данные в памяти по мере прохождения строк, а не загружать все данные в память сразу.

Member 14119435

Спасибо, мой друг.
Итак ,когда у меня есть много записей в базе данных , например, если я извлекаю их каждую тысячу записей и выполняю свою операцию, а затем извлекаю новые записи, память освобождается от предыдущих данных gc??

1 Ответов

Рейтинг:
11

Member 14119435

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

OriginalGriff

У вас нет никакого реального прямого контроля над использованием памяти, кроме как вручную вызывать сборщик мусора. В .NET нет инструкции "release this memory", все, что вы можете сделать, это удалить все ссылки на используемую память и позволить GC сделать это.

А пример кода "что я пробовал", который вы показываете, ничего не меняет: он извлекает весь набор данных из SQL в одной монолитной операции (используя память как на вашем ПК, так и на ПК SQL Server)

Member 14119435

в коде "что я пробовал" я хочу сказать , что использую ado.net чтобы принести.
"все, что вы можете сделать, это удалить все ссылки на используемую память и позволить GC делать свое дело"
об этом утверждении , как я удаляю ссылки на используемую память?
Спасибо за время, которое вы тратите, чтобы направить меня.

OriginalGriff

variableIDontWantAnymore = null;

Member 14119435

Спасибо, мой друг.
набор данных.Таблицы["Запись"].Четкий();
Может ли использование этой фразы быть также уместным?

OriginalGriff

Быстрый просмотр справочных источников говорит о том, что он, вероятно, делает то же самое - похоже, что он перераспределяет новый экземпляр в памяти, который сделает предыдущие данные доступными для GC.

Member 14119435

ОК.
Спасибо за то время которое вы потратили чтобы направлять меня и Ваши советы мой друг