Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.99/70: Рейтинг темы: голосов - 70, средняя оценка - 4.99
13 / 13 / 5
Регистрация: 15.03.2009
Сообщений: 55
1

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

17.03.2009, 22:31. Показов 14484. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Написал простенькую консольную програмку с несколькими классами.
В диспечере задач она занимает не меньше 11 мб памяти. хотелось бы уменьшить. может есть какие-то параметры для компилятора или CLR для уменьшения расхода памяти?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.03.2009, 22:31
Ответы с готовыми решениями:

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

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

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

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

19
19 / 19 / 2
Регистрация: 16.03.2009
Сообщений: 36
17.03.2009, 23:24 2
Ну не видя кода твоей програмки сложно что то сказать, но распространенная ошибка это использование переменных например когда небольшие целые значения использовать int, а не long или вобще byte, ushort вместо ulong, дело в том что при неправильном назначении переменных система резервирует для них память на все знаки хотя по сути используется один или 2 из за этого большое выделение оперативной памяти.
0
13 / 13 / 5
Регистрация: 15.03.2009
Сообщений: 55
17.03.2009, 23:31  [ТС] 3
Вот код. Она правда ведет себя как то странно - 1 раз вообще гдето 400 кб занимало а щас 3-4 мб. мне кажется это CLR выделяет "про запас"
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
using System;
using System.Net;
using System.Text;
using System.Threading;
using System.Diagnostics;
using System.Collections.Generic;
 
namespace MyProgram
{
    enum SpeedState : short { High, Low };
 
    class SpeedOptions : Dictionary<string, string>
    {
        public override string ToString()
        {
            StringBuilder sb = new StringBuilder("?action=setsetting");
            foreach(KeyValuePair<string, string> opt in this)
            {
                sb.AppendFormat("&s={0}&v={1}", opt.Key, opt.Value);
            }
            return sb.ToString();
        }
    }
 
    class SpeedSwitch
    {
        private static SpeedState currentState = SpeedState.High;
        private static string ip = "127.0.0.1";
        private static uint port = 8080;
        private static string login = "admin";
        private static string password = "";
        private static SpeedOptions[] speedValues;
 
        static SpeedSwitch()
        {
            speedValues = new SpeedOptions[Enum.GetValues(SpeedState.High.GetType()).Length];
 
            speedValues[(short)SpeedState.High] = new SpeedOptions();
            speedValues[(short)SpeedState.High]["max_dl_rate"] = "0";
            speedValues[(short)SpeedState.High]["max_ul_rate"] = "0";
 
            speedValues[(short)SpeedState.Low] = new SpeedOptions();
            speedValues[(short)SpeedState.Low]["max_dl_rate"] = "10";
            speedValues[(short)SpeedState.Low]["max_ul_rate"] = "5";
        }
 
        public static void ChangeState(SpeedState state)
        {
            if (state != currentState)
            {
                try
                {
                    HttpWebRequest req = (HttpWebRequest)WebRequest.Create(string.Format("http://{0}:{1}/gui/{2}", ip, port, speedValues[(short)state]));
                    req.Credentials = new NetworkCredential(login, password);
                    req.GetResponse();
                    currentState = state;
                }
                catch (Exception e)
                {
                    // To do: Exception log
                }
            }
        }
    }
 
    class ProcessChecker
    {
        private static List<string> processes, computers;
 
        static ProcessChecker()
        {
            processes = new List<string>();
 
            computers = new List<string>();
            computers.Add("."); // Local Computer
        }
 
        public static void AddProcess(string p)
        {
            if (!processes.Contains(p))
                processes.Add(p);
        }
 
        public static bool Check()
        {
            for (int c = 0; c < computers.Count; ++c)
                for (int p = 0; p < processes.Count; ++p)
                {
                    if (Process.GetProcessesByName(processes[p], computers[c]).Length > 0)
                    {
                        string str;
                        if (c != 0)
                        {
                            str = computers[c];
                            computers.RemoveAt(c);
                            computers.Insert(0, str);
                        }
                        if (p != 0)
                        {
                            str = processes[p];
                            processes.RemoveAt(p);
                            processes.Insert(0, str);
                        }
                        return true;
                    }
            }
            return false;
        }
    }
 
    class Program
    {
        static void Main(string[] args)
        {
 
            ProcessChecker.AddProcess("opera");
 
            while (true)
            {
                if (ProcessChecker.Check())
                    SpeedSwitch.ChangeState(SpeedState.Low);
                else
                    SpeedSwitch.ChangeState(SpeedState.High);
                Thread.Sleep(1000);
            }
        }
    }
}
0
1923 / 428 / 41
Регистрация: 12.07.2007
Сообщений: 2,062
18.03.2009, 03:01 4
Можно избавиться от коллекций. Коллекция выделяет память кратно 2. Если будет 4 элемента будет, выделено под 4 элемента. Если 5, то выделено будет 8. и т.д.
0
13 / 13 / 5
Регистрация: 15.03.2009
Сообщений: 55
18.03.2009, 14:05  [ТС] 5
Цитата Сообщение от Green Посмотреть сообщение
Можно избавиться от коллекций. Коллекция выделяет память кратно 2. Если будет 4 элемента будет, выделено под 4 элемента. Если 5, то выделено будет 8. и т.д.
я уверен это не снизит сильно расход памяти! ну сколько там занимают эти две строки? пару килобайт? темболее мне надо динамически менять местами данные в колекции и иметь возможность добавлять новые - если пользоваться массивами потери памяти будут в разы больше, т.к. каждый раз при любой операции будет создаваться копия массива
0
1923 / 428 / 41
Регистрация: 12.07.2007
Сообщений: 2,062
19.03.2009, 04:28 6
Дык, все остальное системные классы..

P.S. Не то, что бы вариант, но тем не менее. Если нужен минимум памяти, используйте не управляемый код, например C++.
0
13 / 13 / 5
Регистрация: 15.03.2009
Сообщений: 55
21.03.2009, 22:42  [ТС] 7
Цитата Сообщение от Green Посмотреть сообщение
Дык, все остальное системные классы..
P.S. Не то, что бы вариант, но тем не менее. Если нужен минимум памяти, используйте не управляемый код, например C++.
нашел в инете один клас, который помогает снизить количество расходуемой памяти. периодически вызываеш единственный его метод - провоится сборка мусора и очистка памяти. вызываю раз 1 минуту - приложение занимает в памяти не больше 3 мб (хотя до этого 10 - 17 мб)
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
    public class MemoryManagement
    {
        [DllImportAttribute("kernel32.dll", EntryPoint = "SetProcessWorkingSetSize", ExactSpelling = true, CharSet = CharSet.Ansi, SetLastError = true)]
 
        private static extern int SetProcessWorkingSetSize(IntPtr process, int minimumWorkingSetSize, int maximumWorkingSetSize);
        public static void FlushMemory()
        {
            GC.Collect();
            GC.WaitForPendingFinalizers();
            if (Environment.OSVersion.Platform == PlatformID.Win32NT)
                SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1);
        }
    }
0
1 / 1 / 0
Регистрация: 24.03.2009
Сообщений: 9
24.03.2009, 20:45 8
Опиши для каждого класса деструктор (финализатор) и в конце приложения вызови сборщик мусора (GC.Collect()) . Помогает
0
Smart is the new Sexy
32 / 32 / 1
Регистрация: 29.12.2008
Сообщений: 109
25.03.2009, 00:49 9
Зачем для каждого класса финализатор писать? Это только уменьшит производительность и удлинит сборку мусора. Достаточно просто вызвать сборщик мусора.
C#
1
2
            GC.Collect();
            GC.WaitForPendingFinalizers();
1
683 / 232 / 16
Регистрация: 15.10.2007
Сообщений: 1,247
25.03.2009, 01:06 10
онне нужно вызывать он сам вызывается перед закрытием
0
1923 / 428 / 41
Регистрация: 12.07.2007
Сообщений: 2,062
25.03.2009, 02:25 11
Цитата Сообщение от Пулемётчик Посмотреть сообщение
Опиши для каждого класса деструктор (финализатор) и в конце приложения вызови сборщик мусора (GC.Collect()) . Помогает
Вместо деструктора корректней использовать наследование от IDisposable.
0
1 / 1 / 0
Регистрация: 24.03.2009
Сообщений: 9
25.03.2009, 19:42 12
Ещё можно сократить неиспользуемые namespace.....
У меня кстати была точно такая же проблема. Простенький консольный ICQ клиент узурпировал 20 мб памяти.... Но на проверку, в солюшене я увидел два файла-обычный exe и некий .vshost.exe.... В диспетчере,при запуске приложения из VS2008 был именно последний. После закрытия VS, и запуска обычного exeшника (из папки солюшена) оказалось что он занимает 7 мб...... Чем это обусловлено-понятия не имею..
0
13 / 13 / 5
Регистрация: 15.03.2009
Сообщений: 55
26.03.2009, 00:23  [ТС] 13
Цитата Сообщение от Пулемётчик Посмотреть сообщение
Опиши для каждого класса деструктор (финализатор) и в конце приложения вызови сборщик мусора (GC.Collect()) . Помогает
Зачем для каждого класса писать финализатор??? И что в нем писать? Вы хоть знаете зачем они нужны вообще? И что такое "конец приложения" интерестно бы узнать

Добавлено через 2 минуты 6 секунд
Цитата Сообщение от Пулемётчик Посмотреть сообщение
Ещё можно сократить неиспользуемые namespace.....
А что это за бред? Почитайте пожалуйста хоть немного теории (в особенности значение пространств имен) прежде чем чтото советовать
0
326 / 159 / 45
Регистрация: 06.12.2012
Сообщений: 305
26.03.2009, 01:22 14
Цитата Сообщение от 3d_killer Посмотреть сообщение
Ну не видя кода твоей програмки сложно что то сказать, но распространенная ошибка это использование переменных например когда небольшие целые значения использовать int, а не long или вобще byte, ushort вместо ulong, дело в том что при неправильном назначении переменных система резервирует для них память на все знаки хотя по сути используется один или 2 из за этого большое выделение оперативной памяти.
Мда вы конечно меня извините, или исправте вдруг чего... Но int, long, byte etc. разве в С# не структура и говорить о 8,4, 2, 1 байт(-ов) выделение памяти на стоко глуппо... Когда вы создадите переменную 1кб как минимум будет...

Одним словом задайте переменную и на типе нажмите Go-to definition.... И вы увидите скока еще разного-- иногда ненужного подгружается...
0
13 / 13 / 5
Регистрация: 15.03.2009
Сообщений: 55
26.03.2009, 10:59  [ТС] 15
Цитата Сообщение от SkyNick99 Посмотреть сообщение
Мда вы конечно меня извините, или исправте вдруг чего... Но int, long, byte etc. разве в С# не структура и говорить о 8,4, 2, 1 байт(-ов) выделение памяти на стоко глуппо... Когда вы создадите переменную 1кб как минимум будет...
Одним словом задайте переменную и на типе нажмите Go-to definition.... И вы увидите скока еще разного-- иногда ненужного подгружается...
в целом согласен - это не С++ типы, но для отдельной переменной в памяти держится только значения полей, а все методы хранятся на уровне класса, т.е. для всех экземпляров для этого класа они одни и те же. Так что вполне может быть столько и занимает отдельная переменная (sizeof(int) выдает 4 ), правда быстродействие полюбому пониже чем у аналогов в С++.
0
683 / 232 / 16
Регистрация: 15.10.2007
Сообщений: 1,247
26.03.2009, 16:15 16
Как бы не было по любому под байтовую переменную выделяется меньше памяти

Добавлено через 2 часа 33 минуты 51 секунду
Если есть классы где не используешь наследование,то воспользуйся структурами
0
1 / 1 / 0
Регистрация: 24.03.2009
Сообщений: 9
26.03.2009, 18:52 17
Цитата Сообщение от Hort Посмотреть сообщение
Зачем для каждого класса писать финализатор??? И что в нем писать? Вы хоть знаете зачем они нужны вообще? И что такое "конец приложения" интерестно бы узнать

Добавлено через 2 минуты 6 секунд

А что это за бред? Почитайте пожалуйста хоть немного теории (в особенности значение пространств имен) прежде чем чтото советовать

1.Деструкторы используются для уничтожения экземпляров классов.Деструктор неявным образом вызывает метод Finalize для базового класса объекта.Писать в нём ничего не нужно.
Под фразой "конец приложения" я имел ввиду окончание метода Main.
2.Спасибо,прочитал.
3. Вы бы лучше не искали чужие ошибки,а попытались помочь людям.
0
13 / 13 / 5
Регистрация: 15.03.2009
Сообщений: 55
26.03.2009, 19:11  [ТС] 18
Цитата Сообщение от Пулемётчик Посмотреть сообщение
1.Деструкторы используются для уничтожения экземпляров классов.Деструктор неявным образом вызывает метод Finalize для базового класса объекта.Писать в нём ничего не нужно.
Зачем в моем примере явно вызывать деструкторы? Свои создаю единоразово и они мне нужны все время. Темболее Finalize используется только для освобожденя неуправляемых ресурсов. В управляемой памяти все за вас сделает сборщик мусора
Цитата Сообщение от Пулемётчик Посмотреть сообщение
Под фразой "конец приложения" я имел ввиду окончание метода Main.
зачем вызывать сборщик мусора в конце Main? Когда будет конец Main - приложение завершится и автоматически выгрузится из памяти. Ктомуже если вы заметили в моем случае - у меня бесконечный цикл в Main - следовательно выполнение до конца Main никогда и не дойдет.
Цитата Сообщение от Пулемётчик Посмотреть сообщение
2.Спасибо,прочитал.
Вы наверно имели ввиду ссылки на используемые стандартные библиотеки - так вот это никаким образом не влияет на количество используемой памяти, код из стандартной библиотеки компилируется и загружается в память только тогда, когда используется, следовательно ни на размер исполняемого файла, ни на занимаемое место в памяти они не влияют.
Цитата Сообщение от Пулемётчик Посмотреть сообщение
3. Вы бы лучше не искали чужие ошибки,а попытались помочь людям.
я нечего не советую если не разбираюсь в данном вопросе по крайней мере хорошо, а с учетом того что я только начал учить С# мне толком то нечего и посоветывать никому
0
27 / 27 / 2
Регистрация: 09.12.2008
Сообщений: 138
27.03.2009, 01:53 19
можно утилитой Ngen.exe создать откомпилированный вариант без ИЛ кода, или смотреть не на дебаг версию файла а сделать релис.
0
85 / 85 / 6
Регистрация: 13.10.2008
Сообщений: 144
30.03.2009, 19:49 20
Возник вопрос по теме: почему при простом перемещении(или resize'е) окна приложения увеличивается тот самый working set, что отображается в диспетчере задач?
0
30.03.2009, 19:49
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.03.2009, 19:49
Помогаю со студенческими работами здесь

Увеличение потребляемой памяти
Форма динам создается(то грид в ней,то кнопки),а после закрытие естественно стает в очередь на...

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

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

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


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

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