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

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

09.02.2017, 11:01. Показов 2480. Ответов 16

Author24 — интернет-сервис помощи студентам
Добавляю запись в таблицу 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
private void insertData()
{
string conStr = "server=127.0.0.1;user=root;" +
"database=test;password=123;";
using (MySqlConnection con = new MySqlConnection(conStr))
{
try
{
string sql = "INSERT INTO friends (name, lastname, age)" +
"VALUES (@Name, @LastName, @Age);";
con.Open();
MySqlCommand cmd = new MySqlCommand(sql, con);
//создаем параметры и добавляем их в коллекцию
cmd.Parameters.AddWithValue("@Name", "Vasya");
cmd.Parameters.AddWithValue("@LastName", "Pupkin");
cmd.Parameters.AddWithValue("@Age", 18);
cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
Собрал решение в *.exe файл.
Принцип работы:
Вводим количество записей, которое необходимо добавить.
Запускаем.
Программа добавляет необходимое количество записей в таблицу.

Проблема.
При работе программы растёт потребляемая ей оперативная память.

Вопрос.
Как сделать, чтобы потребляемая оперативная память программой в процессе работы оставалась на одном уровне?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.02.2017, 11:01
Ответы с готовыми решениями:

Как уменьшить объём потребляемой оперативной памяти?
Используется C# MySql При добавлении в таблицу MySql новых записей растёт потребление...

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

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

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

16
1643 / 1144 / 171
Регистрация: 23.07.2010
Сообщений: 6,794
09.02.2017, 11:28 2
писать свой драйвер для доступа к мускулу
2
Администратор
Эксперт .NET
17023 / 13375 / 5218
Регистрация: 17.03.2014
Сообщений: 27,353
Записей в блоге: 1
09.02.2017, 13:53 3
zakaz_77, можно попробовать использовать одно соединение, одну команду и одни и те жа параметры - меняя только их значения. Имеются в виду объекты MySqlConnection, MySqlCommand, MySqlParameter.
1
3356 / 1775 / 83
Регистрация: 05.08.2010
Сообщений: 4,471
09.02.2017, 13:56 4
Цитата Сообщение от zakaz_77 Посмотреть сообщение
Принцип работы:
Вводим количество записей, которое необходимо добавить.
Запускаем.
Программа добавляет необходимое количество записей в таблицу.
Вот этого не понял. Вы все, к примеру 30 раз, по циклу выполняете данный метод?
У Вас выходит так:
- Открытие соединения
- Выполнение запроса
- Закрытие соединения
..и так 30 раз.
Как сами думаете, что можно в этой схеме изменить?

Именно! Как минимум:
- Открытие соединения
- Выполнение запроса 30 раз
- Закрытие соединения

Это если не разбирать что Вы и зачем делаете.
1
9 / 9 / 4
Регистрация: 23.12.2015
Сообщений: 730
09.02.2017, 14:55  [ТС] 5
В ТС привёл код условный.
Привожу оригинал, как у меня устроено...
В "качестве бреда " добавил строчки с "откл / вкл" соединением через каждые 1000 записей... думал поможет..
Не помогло
C#
1
2
3
4
5
6
if (s == otkl)
        {
            connection.Close();
            connection.Open();
            otkl = s + 1000;
        }
Основной код
Кликните здесь для просмотра всего текста
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
try
{
    string sql = "SELECT * FROM " + textBox51.Text; // Строка запроса
 
    MySqlConnection connection = new MySqlConnection(connStrMySql);                
 
    connection.Open();
 
    #region *** ДОБАВЛЕНИЕ ЗАПИСИ В ТАБЛИЦУ ***
 
    #region *** ПЕРЕМЕННАЯ ***
    int s; // СТАРТ. ПОЗИЦИЯ С КОТОРОЙ НУЖНО НАЧИНАТЬ ДОБАВЛЯТЬ ЗАПИСИ
    s = Convert.ToInt32(textBox55.Text);
 
    int f; // ФИНИШ. ПОЗИЦИЯ НА КОТОРОЙ НУЖНО ЗАКОНЧИТЬ ДОБАВЛЯТЬ ЗАПИСИ
    f = Convert.ToInt32(textBox56.Text);
 
    int r = f - s; // КОЛ. КОЛИЧЕСТВО ПОЗИЦИЙ, КОТОРОЕ ТРЕБУЕТСЯ ДОБАВИТЬ                               
 
    int otkl = s + 1000;
    #endregion *** ПЕРЕМЕННАЯ ***. КОНЕЦ ХХХ
 
    for (s = Convert.ToInt32(textBox55.Text); s <= f; s++) // 
    {
        pol_2 = s;                
 
        int col;
        col = Convert.ToInt32(textBox59.Text);
 
        for (int pol_3 = 1; pol_3 <= col; pol_3++) // 
        {
 
            MySqlCommand sqlCom = new MySqlCommand
            ("INSERT INTO " + textBox51.Text + // ТАБЛИЦА
            "(" + textBox52.Text + // ПОЛЯ
            ") VALUES"
            + "('"
            +                     
            pol_1 + "', '" + pol_2 + "', '" + pol_3 + "', '" + pol_4 + "', '" + pol_5 + "', '" + pol_6 + "', '" + pol_7 + "', '" + pol_8 + "', '" + pol_9 + "', '" + pol_10 + "', '" + pol_11 + "', '" + pol_12 + "', '" + pol_13 + "', '" + pol_14 + "', '" + pol_15 + "', '" + pol_16 + "', '" + pol_17                     
            +
            "')",
            connection); // РАБОТАЕТ. ПОДСТАВЛЯЕТСЯ значение из переменных
            sqlCom.ExecuteNonQuery();
        }
 
        if (s == otkl)
        {
            connection.Close();
            connection.Open();
            otkl = s + 1000;
        }
 
    }                
    MessageBox.Show("Добавлено " + r + " записей ");
    return;
 
}
catch (Exception ex)
{
    richTextBox1.Text += "!" + "\r\n";
    richTextBox1.Text += "ОШИБКА" + "\r\n";
 
    textBox1.AppendText("! " + "\r\n");
    textBox1.AppendText("ОШИБКА ХХХ " + "\r\n");
 
    MessageBox.Show(ex.ToString());
    MessageBox.Show("ОШИБКА ХХХ ");
    return;
}



OwenGlendower,

Цитата Сообщение от OwenGlendower Посмотреть сообщение
Имеются в виду объекты MySqlConnection, MySqlCommand, MySqlParameter.
Если не сложно можно на моём примере, как-нибудь кратко показать... Или ссылку где предложенный вами вариант более подробно рассматривается


Agapov_stas,
Цитата Сообщение от Agapov_stas Посмотреть сообщение
Вот этого не понял. Вы все, к примеру 30 раз, по циклу выполняете данный метод?
см. код выше


PS.
В C# начинающий, поэтому прошу делать скидку на некорректность решений
0
Эксперт .NET
17688 / 12873 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
09.02.2017, 15:12 6
Цитата Сообщение от zakaz_77 Посмотреть сообщение
При работе программы растёт потребляемая ей оперативная память.
Это нормально.
Плохо будет, если память начнет расти неограниченно, в конце-концов валя приложение с OutOfMemoryException.

В вашем коде есть места, которые можно улучшить, однако это лишь немного уменьшит рост потребляемой памяти, но не остановит его полностью.
1
Администратор
Эксперт .NET
17023 / 13375 / 5218
Регистрация: 17.03.2014
Сообщений: 27,353
Записей в блоге: 1
09.02.2017, 16:00 7
Лучший ответ Сообщение было отмечено zakaz_77 как решение

Решение

zakaz_77, вот вариант с одной командой и использованием параметров
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
try
{
    using (MySqlConnection connection = new MySqlConnection(connStrMySql))
    {
        string sql = string.Format(
            "INSERT INTO {17} ({18}) VALUES ('{0}', @pol_2, @pol3, {3}, {4}, {5}, {6}, {7}, {8}, {9}, {10}, {11}, {12}, {13}, {14}, {15}, {16})",
            // pol_2 и pol_3 указаны в кавычках чтобы показать что они не используются
            // Они нужны нам только для непрерывной нумерации аргцментов для string.Format
            pol_1, "pol_2", "pol_3", pol_4, pol_5, pol_6, pol_7, pol_8, pol_9, pol_10, pol_11, pol_12, pol_13, pol_14, pol_15, pol_16, pol_17,
            textBox51.Text, textBox52.Text
        );
        MySqlCommand sqlCom = new MySqlCommand(sql, connection);
        MySqlParameter prm_pol_2 = new MySqlParameter("@pol_2", MySqlDbType.Int32);
        MySqlParameter prm_pol_3 = new MySqlParameter("@pol_3", MySqlDbType.Int32);
        sqlCom.Parameters.Add(prm_pol_2);
        sqlCom.Parameters.Add(prm_pol_3);
        
        connection.Open();
 
        int start = Convert.ToInt32(textBox55.Text);
        int finish = Convert.ToInt32(textBox56.Text);
        int col = Convert.ToInt32(textBox59.Text);
        for (int i=start; i<=finish; i++)
        {
            prm_pol_2.Value = i;        
            for (int pol_3 = 1; pol_3 <= col; pol_3++)
            {
                prm_pol_3.Value = pol_3;
                sqlCom.ExecuteNonQuery();
            }
        }
    }
    MessageBox.Show("Добавлено " + (finish - start + 1) + " записей ");
    return;
}
catch (Exception ex)
{
    richTextBox1.Text += "!" + "\r\n";
    richTextBox1.Text += "ОШИБКА" + "\r\n";
 
    textBox1.AppendText("! " + "\r\n");
    textBox1.AppendText("ОШИБКА ХХХ " + "\r\n");
 
    MessageBox.Show(ex.ToString());
    MessageBox.Show("ОШИБКА ХХХ ");
    return;
}
Добавлено через 4 минуты

Не по теме:

Цитата Сообщение от zakaz_77 Посмотреть сообщение
В ТС привёл код условный
ТС это автор темы - topic starter. Как можно в человеке привести код? :)

1
9 / 9 / 4
Регистрация: 23.12.2015
Сообщений: 730
09.02.2017, 20:56  [ТС] 8
OwenGlendower,

Выдаёт ошибку
Сообщение об ошибке см. скрин.
Как выглядит таблица см. скрин.

Перед началом добавлением записей в textBox52.Text ввожу - tbl, idsub, pol_3, pol_4, pol_5, pol_6, pol_7, pol_8, pol_9, pol_10, pol_11, pol_12, pol_13, pol_14, pol_15, pol_16, pol_17

Таблица
Кликните здесь для просмотра всего текста

MySQL
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
CREATE TABLE `tbl8` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `tbl` LONGTEXT NULL,
    `idsub` INT(11) NULL DEFAULT NULL,
    `pol_3` INT(11) NULL DEFAULT NULL,
    `pol_4` LONGTEXT NULL,
    `pol_5` LONGTEXT NULL,
    `pol_6` LONGTEXT NULL,
    `pol_7` LONGTEXT NULL,
    `pol_8` LONGTEXT NULL,
    `pol_9` LONGTEXT NULL,
    `pol_10` LONGTEXT NULL,
    `pol_11` LONGTEXT NULL,
    `pol_12` LONGTEXT NULL,
    `pol_13` LONGTEXT NULL,
    `pol_14` LONGTEXT NULL,
    `pol_15` LONGTEXT NULL,
    `pol_16` LONGTEXT NULL,
    `pol_17` LONGTEXT NULL,
    UNIQUE INDEX `id` (`id`),
    INDEX `tbl8_idsub_IDX` (`idsub`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
ROW_FORMAT=COMPACT
AUTO_INCREMENT=710275
;
Миниатюры
Как уменьшить объём потребляемой оперативной памяти программой?  
0
Администратор
Эксперт .NET
17023 / 13375 / 5218
Регистрация: 17.03.2014
Сообщений: 27,353
Записей в блоге: 1
09.02.2017, 21:07 9
zakaz_77, в мой пример вкралась опечатка. В строке №6 не хватает подчеркивания в имени параметра. Вместо @pol3 должно быть @pol_3.

P.S. При выкладывании скриншота не мешает задуматься о его качестве - текст должен читаться без усилий. В данном случае лучше было выложит два скриншота нормального размера.
1
9 / 9 / 4
Регистрация: 23.12.2015
Сообщений: 730
09.02.2017, 21:14  [ТС] 10
OwenGlendower,
Ещё ошибка
Не могли вы ещё посмотреть....
Миниатюры
Как уменьшить объём потребляемой оперативной памяти программой?  
0
Администратор
Эксперт .NET
17023 / 13375 / 5218
Регистрация: 17.03.2014
Сообщений: 27,353
Записей в блоге: 1
09.02.2017, 21:30 11
zakaz_77, номера шаблонов подстановки - {N} в строке форматирования - и кол-во аргументов должны совпадать. На скриншоте видно что ты методу String.Format передается 18 аргументов для подстановки, а в строке форматирования используется шаблон с номером 18 - то есть нужен 19-й аргумент. Подумай самостоятельно как это нужно исправить.
1
9 / 9 / 4
Регистрация: 23.12.2015
Сообщений: 730
09.02.2017, 22:31  [ТС] 12
OwenGlendower,

Всё равно не могу понять… Не работает

Во всех интернет источниках синтаксис немножко другой…

Что такое "Цифра 1" (16) и "Цифра 2" (17). См. скрин
В вашем варианте это было
"INSERT INTO {17} ({18}) VALUES

В textBox52.Text ввожу tbl, idsub, pol_3, pol_4, pol_5, pol_6, pol_7, pol_8, pol_9, pol_10, pol_11, pol_12, pol_13, pol_14, pol_15, pol_16, pol_17
Миниатюры
Как уменьшить объём потребляемой оперативной памяти программой?  
0
Администратор
Эксперт .NET
17023 / 13375 / 5218
Регистрация: 17.03.2014
Сообщений: 27,353
Записей в блоге: 1
10.02.2017, 00:14 13
zakaz_77, string.Format принимает первым аргументом строку форматирования, за которым идут один или более аргументов для подстановки в строку форматирования на место обозначенное {N}. Число N обозначает порядковый номер аргумента подстановки. Этот номер отсчитывается от 0 (также как индекс массива). Для корректной работы функции string.Format требуется чтобы ей были переданы все аргументы на которые "ссылается" строка форматирования.

В рамках данного примера в строке форматирования указаны номера 0, 4...17. Значит после строки форматирования нужно передать 18 аргументов. В приведенном коде передается 19. Ошибка возникает потому аргументы с номерами 16 и 17 зачем-то подставляются два раза - один раз на место имени таблицы и списка колонок, второй раз в качестве значений. Еще одна проблема видимо в том что не хватает кавычек вокруг значений. Из первоначального примера не было ясно что из себя представляют эти колонки. Я решил что цифры. Вот новый исправленный ввриант в "классическом" стиле
C#
1
2
3
4
5
string sql = string.Format(
    "INSERT INTO {0} ({1}) VALUES ('{2}', @pol_2, @pol3, '{3}', '{4}', '{5}', '{6}', '{7}', '{8}', '{9}', '{10}', '{11}', '{12}', '{13}', '{14}', '{15}', '{16}'')",
    textBox51.Text, textBox52.Text,
    pol_1, pol_4, pol_5, pol_6, pol_7, pol_8, pol_9, pol_10, pol_11, pol_12, pol_13, pol_14, pol_15, pol_16, pol_17
);
Цитата Сообщение от zakaz_77 Посмотреть сообщение
Что такое "Цифра 1" (16) и "Цифра 2" (17).
Это порядковый номер аргумента переданный после строки форматирования который подставляется на это место. Советую закрыть этот пробел в знаниях прочитав Getting started with the String.Format method (краткое введение) и Formatting Types in the .NET Framework (более подробное описание).
1
9 / 9 / 4
Регистрация: 23.12.2015
Сообщений: 730
29.03.2017, 13:43  [ТС] 14
OwenGlendower,
Можно ли данный фрагмент кода сделать через запятую или как-то по другом оптимизировать пространство занимаемое кодом?
Т.е. исходный код
C#
1
2
3
4
5
MySqlParameter prm_pol_2 = new MySqlParameter("@pol_2", MySqlDbType.Int32);
MySqlParameter prm_pol_3 = new MySqlParameter("@pol_3", MySqlDbType.Int32);
 
sqlCom.Parameters.Add(prm_pol_2);
sqlCom.Parameters.Add(prm_pol_3);
А сделать что-нибудь в духе:
C#
1
2
3
    
MySqlParameter prm_pol_2, prm_pol_3 = new MySqlParameter("@pol_2", MySqlDbType.Int32, "@pol_3", MySqlDbType.Int32);
sqlCom.Parameters.Add(prm_pol_2, prm_pol_3);
А то как-то громоздко, когда много полей...
0
Администратор
Эксперт .NET
17023 / 13375 / 5218
Регистрация: 17.03.2014
Сообщений: 27,353
Записей в блоге: 1
29.03.2017, 14:07 15
zakaz_77, простые значения (числа, строки) можно добавлять с помощью AddWithValue
C#
1
2
sqlCom.Parameters.AddWithValue("@pol_2", pol_2);
sqlCom.Parameters.AddWithValue("@pol_3", pol_3);
Кучу параметров можно добавить через метод AddRange. Если они кажутся длинными, то придумай более короткую обертку и пользуйся ей.
1
9 / 9 / 4
Регистрация: 23.12.2015
Сообщений: 730
29.03.2017, 15:39  [ТС] 16
OwenGlendower,
Попробовал соорудить, что-нибудь на базе AddRange.
AddRange подчёркнуто красным и сообщение об ошибке :
" 'MySqlCommand" не содержит определения для "AddRange"
и не удалось найти метод расширения "AddRange",
принимающий тип "MySqlCommand" в качестве первого аргумента
(возможно, пропущена директива using или ссылка на сборку)"

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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
using System.Data.OleDb;
 
using MySql.Data.MySqlClient;
 
 
            string sql = string.Format(
                "INSERT INTO {0}             ({1})               VALUES ( @id_thema_frm, @id_soob)",
                             textBox51.Text, textBox52.Text, pol_1 
                                   );           
 
            using (MySqlConnection connection = new MySqlConnection(connStrMySql))
            {
                MySqlCommand sqlCom = new MySqlCommand(sql, connection);
 
                MySqlParameter[] myArray = new MySqlParameter[]
                { new MySqlParameter("@id_thema_frm", MySqlDbType.String),
                  new MySqlParameter("@id_soob", MySqlDbType.String)
                };
                sqlCom.AddRange(myArray);
            }
Не могли бы вы подсказать в чём проблема?
0
Эксперт .NET
5534 / 4298 / 1217
Регистрация: 12.10.2013
Сообщений: 12,332
Записей в блоге: 2
29.03.2017, 15:48 17
Цитата Сообщение от zakaz_77 Посмотреть сообщение
" 'MySqlCommand" не содержит определения для "AddRange"
sqlCom.Parameters.AddRange(myArray);
1
29.03.2017, 15:48
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.03.2017, 15:48
Помогаю со студенческими работами здесь

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

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

Ускорить загрузку программы и уменьшить количество потребляемой памяти
День добрый! Очень важно, чтобы программа не тратила слишком много оперативки, а также загружалось...

Большой размер потребляемой оперативной памяти приложением
Собственно, программа простая, простенькое винформ приложение с несколькими элементами, а...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru