Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
9 / 9 / 4
Регистрация: 23.12.2015
Сообщений: 730

Как уменьшить объём потребляемой оперативной памяти?

19.06.2017, 06:29. Показов 2224. Ответов 10

Студворк — интернет-сервис помощи студентам
Используется
C#
MySql

При добавлении в таблицу MySql новых записей растёт потребление оперативной памяти.

Код

Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
            #region *** ЗАПРОС ***
            tbl_name = textBox115.Text; // Имя редактируемой таблицы. Пирсваиваем значение переменной
            sql_zpr_01 = "SELECT * FROM " + tbl_name; // Строка запроса
            #endregion *** ЗАПРОС ***
            
            sqlCom_0 = new MySqlCommand(sql_zpr_01, connMySql_db_2);
            sqlCom_0.ExecuteNonQuery();            
            MySqlDtAdp_0 = new MySqlDataAdapter(sqlCom_0);
            
            #region *** СОЗДАНИЕ ДТ ***
            dt_025 = new DataTable();            
            
            MySqlDtAdp_0.Fill(dt_025); // -> DataTable            
            #endregion *** СОЗДАНИЕ ДТ ***
            
            MySqlCommandBuilder commandBuilder = new MySqlCommandBuilder(MySqlDtAdp_0);
            
            
            int str; // кол. строк в пакете
            
            str = Convert.ToInt32(textBox123.Text); // кол. строк 
                for (int s = 1; s <= str; s++)
                {
                    name_str = textBox116.Text + "_" + s;
                    zpch_str = textBox117.Text + "_" + s;                
 
                    newRow = dt_025.NewRow();
                    newRow["name"] = name_str;
                    newRow["zpch"] = zpch_str;
                    dt_025.Rows.Add(newRow);
                }
                MySqlDtAdp_0.Update(dt_025);

Вопрос
Как уменьшить объём потребляемой оперативной памяти?

Дополню: при добавлении записей с использованием MySqlParameter увеличение потребления оперативной памяти не происходит.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.06.2017, 06:29
Ответы с готовыми решениями:

Как уменьшить объём потребляемой оперативной памяти программой?
Добавляю запись в таблицу MySql кодом private void insertData() { string conStr = &quot;server=127.0.0.1;user=root;&quot; + ...

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

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

10
Эксперт .NET
 Аватар для Usaga
14292 / 9377 / 1352
Регистрация: 21.01.2016
Сообщений: 35,338
19.06.2017, 07:36
zakaz_77, метод MySqlDtAdp_0.Fill() сам выполнит запрос, не нужно его явно перед этим выполнять (sqlCom_0.ExecuteNonQuery();).

И кто вас научил такие беспонтовые имена сущностям давать? Давайте нормальные, осмысленные названия, а не всякую аббревиатуру как в конструкторской документации (dt_025, sqlCom_0).

В чём выражается "потребление памяти"? Как это замерялось? На глаз, в Task Manager?
1
360 / 287 / 76
Регистрация: 21.06.2016
Сообщений: 1,115
19.06.2017, 08:58
Я тоже не увидел, в каком месте может такое уж большое увеличение памяти происходить.
Разве что в момент добавления строк в таблицу. Если это временная таблица - может быть есть смысл делать ей Dispose() в конце метода обновления.
Все строки, что добавляются в цикле - после каждой итерации и так будут убираться чистильщиком.
А так... ну фиг его знает.
1
9 / 9 / 4
Регистрация: 23.12.2015
Сообщений: 730
21.06.2017, 12:24  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
В чём выражается "потребление памяти"? Как это замерялось? На глаз, в Task Manager?
При запуске программы видно в диспетчере задач, что растёт память.

Цитата Сообщение от hoolygan Посмотреть сообщение
Если это временная таблица - может быть есть смысл делать ей Dispose() в конце метода обновления.
Дополнил код:
- добавил цикл;
- добавил Dispose();

Проблема осталась...
Хотя может я неправильно делаю..

Буду признателен. если поправите
Используем MySqlCommandBuilder КОД 1
Кликните здесь для просмотра всего текста

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
// ПЕРЕМЕННЫЕ
DataTable  dt_027; 
BindingSource bs_027; 
 
 
#region *** ЗАПРОС ***
  tbl_name = textBox115.Text; // Имя редактируемой таблицы. Пирсваиваем значение переменной
  sql_zpr_01 = "SELECT * FROM " + tbl_name; // Строка запроса
#endregion *** ЗАПРОС ***
 
    sqlCom_0 = new MySqlCommand(sql_zpr_01, connMySql_db_2);
    sqlCom_0.ExecuteNonQuery();            
    MySqlDtAdp_0 = new MySqlDataAdapter(sqlCom_0);
 
#region *** СОЗДАНИЕ ДТ ***
  dt_025 = new DataTable();            
 
  MySqlDtAdp_0.Fill(dt_025); // -> DataTable            
#endregion *** СОЗДАНИЕ ДТ ***
 
MySqlCommandBuilder commandBuilder = new MySqlCommandBuilder(MySqlDtAdp_0);
 
int pac = Convert.ToInt32(textBox129.Text); // кол. пакетов
int str = Convert.ToInt32(textBox123.Text); // кол. строк в пакете
 
 
for (int p = 1; p <= pac; p++)
 {
 
    for (int s = 1; s <= str; s++)
    {
      name_str = textBox116.Text + "_" + s;
      zpch_str = textBox117.Text + "_" + s;                
 
      newRow = dt_025.NewRow();
      newRow["name"] = name_str;
      newRow["zpch"] = zpch_str;
      dt_025.Rows.Add(newRow);
    }
        
    MySqlDtAdp_0.Update(dt_025);
  // ПОПЫТКА ОЧИСТКИ ОЗУ
  // dt_025.Clear(); // ОЗУ. Растёт
  dt_025.Dispose(); // ОЗУ. Растёт
  
}



Также пробовал нижеприведённый код.
При использовании его оперативка не растёт
Использовать MySqlParameter КОД 2
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
            #region *** ПОДКЛЮЧЕНИЕ ***
            string serverName = textBox46.Text; // Адрес сервера (для локальной базы пишите "localhost")
            string userName = textBox47.Text; // Имя пользователя
            string dbName = textBox48.Text; //Имя базы данных
            string port = textBox49.Text; // Порт для подключения
            string password = textBox50.Text; // Пароль для подключения
 
            connStrMySql_db1 = "server=" + serverName +
               ";user=" + userName +
               ";database=" + dbName +
               ";port=" + port +
               ";password=" + password + ";";
 
            connMySql_db_2 = new MySqlConnection(connStrMySql_db1);
            connMySql_db_2.Open();
            #endregion *** ПОДКЛЮЧЕНИЕ ***
 
            #region *** ЗАПРОС ***
            // ПЕРЕМЕННЫЕ
            string tbl_name = "tst_027"; // ИМЯ ТАБЛИЦЫ
            string sps_pl = "name, zpch"; // список полей                                   
 
            string sql = string.Format(
                "INSERT INTO {0} ({1}) VALUES (@pol_1, @pol_2)",
                    tbl_name, sps_pl);
 
            #endregion *** ЗАПРОС ***
 
            MySqlCommand sqlCom = new MySqlCommand(sql, connMySql_db_2);
 
            #region *** ПАРАМЕТРЫ ***
            MySqlParameter prm_pol_1 = new MySqlParameter("@pol_1", MySqlDbType.VarChar);
            MySqlParameter prm_pol_2 = new MySqlParameter("@pol_2", MySqlDbType.VarChar);
 
            sqlCom.Parameters.Add(prm_pol_1);
            sqlCom.Parameters.Add(prm_pol_2);
 
 
            #endregion *** ПАРАМЕТРЫ ***
            
            int str = Convert.ToInt32(textBox130.Text); // кол. строк 
 
                for (int s = 1; s <= str; s++)
                {                
                    prm_pol_1.Value = textBox132.Text + "_" + s;
                    prm_pol_2.Value = textBox131.Text + "_" + 1;
 
                    sqlCom.ExecuteNonQuery();
                }
            }


ВОПРОС.
1. В чём может быть проблема?
2. Может не стоит морочится и использовать код с MySqlParameter?
Просто прочитал где-то здесь (Архитектура ПО в WinForms (FAQ & HowTo)),
что сначало нужно обработать данные в программе, а потом отправлять в нужное место.
Или я не правильно понял?
0
Эксперт .NET
 Аватар для Usaga
14292 / 9377 / 1352
Регистрация: 21.01.2016
Сообщений: 35,338
21.06.2017, 12:49
Цитата Сообщение от zakaz_77 Посмотреть сообщение
При запуске программы видно в диспетчере задач, что растёт память.
Это не мера расхода памяти. Это показания погоды в туалете. Особенно с CLR. Там память выделяется блоками, по мере надобности. Эти же блоки потом очищаются, но не обязательно, что возвращаются системе.

Воспользуйтесь профилировщиком для оценки реального расхода памяти. Или не грейте голову.
1
360 / 287 / 76
Регистрация: 21.06.2016
Сообщений: 1,115
21.06.2017, 14:50
zakaz_77, Тут все очень запущено. На самом деле ни Вы , ни я точно не знаем, что зашито в коде адаптера, можем только пользоваться этим. Может быть там действительно косяк, который Вы и выявили. А дезасемблировать, чтобы докопаться - нафиг оно нужно
Цитата Сообщение от zakaz_77 Посмотреть сообщение
Просто прочитал где-то здесь (Архитектура ПО в WinForms (FAQ & HowTo)),
что сначало нужно обработать данные в программе, а потом отправлять в нужное место
А это уже интересно, но, думаю, Вы выдергиваете слова из контекста. Обрабатывать можно по-разному. Ведь мерджить таблицы - это же тоже обработка, но на стороне сиквела эта работа будет происходить на пару порядков быстрее по времени, чем на стороне клиента ) Так что все относительно.
1
9 / 9 / 4
Регистрация: 23.12.2015
Сообщений: 730
21.06.2017, 18:26  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Это не мера расхода памяти. Это показания погоды в туалете.
))
Ну мне в принципе всё равно...
Факт, то что у меня начнёт тормозить комп.
Я правда не разгонял до максимума, но например если программе поставить задачу: добавить 30 000 строк, то результат роста ОЗУ будет выглядеть следующим образом. (см. скрин)
Миниатюры
Как уменьшить объём потребляемой оперативной памяти?  
0
Эксперт .NET
 Аватар для Usaga
14292 / 9377 / 1352
Регистрация: 21.01.2016
Сообщений: 35,338
21.06.2017, 18:32
zakaz_77, не совсем понятно, что вас удивляет. Вы нагружаете приложение данными, оно в ответ, выделяет память под эти данные. В чём противоречие? Не хотите расхода памяти - оптимизируйте код. Волшебства не бывает.
0
9 / 9 / 4
Регистрация: 23.12.2015
Сообщений: 730
21.06.2017, 18:40  [ТС]
Usaga,
Прошу прощения, не совсем понимаю,в чём заключается оптимизация?

В сообщении #4 я привёл два варианта кода
- Используем MySqlCommandBuilder КОД 1 - потребляет ОЗУ
- Использовать MySqlParameter КОД 2 - не потребляет ОЗУ

ВОПРОС.

1. Можно ли сделать чтобы код "MySqlCommandBuilder КОД 1 " не потреблял ОЗУ?
0
HF
 Аватар для HF
1314 / 893 / 200
Регистрация: 09.09.2011
Сообщений: 2,659
Записей в блоге: 2
21.06.2017, 18:54
Цитата Сообщение от zakaz_77 Посмотреть сообщение
ВОПРОС.
1. В чём может быть проблема?
2. Может не стоит морочится и использовать код с MySqlParameter?
Просто прочитал где-то здесь (Архитектура ПО в WinForms (FAQ & HowTo)),
что сначало нужно обработать данные в программе, а потом отправлять в нужное место.
Или я не правильно понял?
1. Проблема в понимании процесса использования ресурсов и ссылок.
Первый пример Абсолютно нечитаемый. Я несколько раз его прошёлся сверху вниз и Не понял что же задумано программистом, что должно делаться. Какой-то Биндинг который нигде вроде бы не используется, какие-то загрузки и не понятно в какую сторону всё выгружается. Вроде бы Fill из базы, ан нет, потом идёт сборка таблицы зачем то. И в конце вообще не вижу никакой записи никуда. Обрезан код?
Сразу же увидел "код подозрительно похожий на ад".
C#
1
2
3
  // ПОПЫТКА ОЧИСТКИ ОЗУ
  // dt_025.Clear(); // ОЗУ. Растёт
  dt_025.Dispose(); // ОЗУ. Растёт
И это происходит в цикле, там же где чуть выше эта же таблица dt_025 постоянно добавляет строки. Конечно диспоза не будет, оно постоянно объект будет "оживлять". А попытки есть. Или я что-то не понимаю или это реально ад.

2. А вот второй вариант абсолютно читаемый и почти идеальный. Конечно же он не будет ничего отжирать. Каждые данные постоянно закидываются в таблицу, наращивания нигде не происходит. Не вижу критичных проблем во втором примере, особенно, по сравнению с первым.
Не помню какие есть возможности в MySQL, но в MsSQL можно использовать табличный параметр и сразу одним запросом всё закинуть, чтобы туда-сюда не бегать. Если такого нет, то можно максимально наращивать INSERT запрос и потом тоже оптом кидать. Короче избегать количественного обмена.

Моё мнение - второй пример должен быть рабочим, в рамках задачи и быстрого решения.

Добавлено через 2 минуты
Цитата Сообщение от zakaz_77 Посмотреть сообщение
1. Можно ли сделать чтобы код "MySqlCommandBuilder КОД 1 " не потреблял ОЗУ?
Если второй вариант идеален, а первый это жуть, то вы всё равно будете пытаться использовать путь первого варианта? Можете тогда обосновать это?
Наверняка можно, но нужно тогда понять зачем это всё там понаписано. Например с какой целью используется MySqlCommandBuilder?
0
Эксперт .NET
 Аватар для Usaga
14292 / 9377 / 1352
Регистрация: 21.01.2016
Сообщений: 35,338
21.06.2017, 18:55
zakaz_77, ну, в случае с кодом из поста #4 можно было бы работать с БД напрямую через ADO.NET, без всяких DataTable и DataAdapter. Более того, ваш код демонстрирует некую разновидность наркомании: вы сначала выполняете запрос (с косвенным получением данных драйвером СУБД), потом ещё один (строго тот же самый, но с полной загрузкой данных, в виде Fill()), и потом просто заносите данные в полученную таблицу с последующим сохранением в БД.

Самая первая оптимизация, что приходит на ум - подключение головного мозга к "обмозговыванию" кода и получению ответа на вопрос: какго хрена нужно дважды загружать некие данные, чтобы просто добавить в БД новые данные не имеющие отношения к загруженным?

Возможно после этого ваша программа станет меньше потреблять памяти...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.06.2017, 18:55
Помогаю со студенческими работами здесь

Узнать, какой объём оперативной памяти занимает приложение
Можно ли каким-нибудь кодом узнать какой объём оперативной памяти занимает приложение/класс? Сколько требует процессорного времени. Всё...

Как уменьшить размер потребляемой памяти?
Доброго времени суток)не подскажите как уменьшить размер потребляемой памяти приложением? К примеру моя программа вести почти 2...

Помогите уменьшить объем потребляемой ОЗУ
Добрый День! Подскажите у меня Joomla 1.6, форум PHPBB3, кол-во форумов вместе с темами 370 000. Дамп загрузился, весит 100 М. Когда...

Как бороться с увеличением объема потребляемой оперативной памяти при сохранении файла Excel без закрытия?
Привет Всем! Вопрос такой, в программе написанной на VBA Ecxel я заметил такую штуку, при каждом сохранении без закрытия файла в ДиспЗадач...

Увеличение потребляемой оперативной памяти
Подскажите, пожалуйта, почему программа после каждого последующего исполнения процедуры использует на 20 мб оперативной памяти больше чем...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru