С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
 Аватар для Hermein
99 / 43 / 16
Регистрация: 25.10.2011
Сообщений: 246
.NET 4.x

Огромное потребление памяти

19.12.2016, 07:01. Показов 1940. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Консольная программа запускается на Ubuntu server 14.04 под mono 4.6.2 в фоновом режиме
При запуске начинает выедать огромными порциями память (при запуске приложение получает данные из базы и прогоняет их в цикле Parallel.For) потребление доходит порой до 4 гигов и Linux убивает приложение.
После прохода цикла и при дальнейшей работе потребление на отметке в 100-300 мб.
Есть ли какой-то способ ограничить максимальное потребление памяти (чтобы тот же сборщик чаще вызывался, падение производительности абсолютно не важно, мне без разницы пройдет цикл за минуту или за 10)?
Разумеется запускается с флагом --gc=sgen
Code
1
2
3
4
5
6
7
8
9
10
Mono JIT compiler version 4.6.2 (Stable 4.6.2.7/08fd525 Mon Nov 21 12:08:40 UTC 2016)
Copyright (C) 2002-2014 Novell, Inc, Xamarin Inc and Contributors. www.mono-project.com
    TLS:           __thread
    SIGSEGV:       altstack
    Notifications: epoll
    Architecture:  amd64
    Disabled:      none
    Misc:          softdebug 
    LLVM:          supported, not enabled.
    GC:            sgen
Дабы избежать расспросов: есть List, Dictionary, методы где они используются их чистят (list.Clear(); Dict.Clear(), создаваемые классы Dispos-ятся (все они являются наследниками от IDisposable), варианта не использовать коллекции (List,Dictionary) попросту нет, ибо количество данных всегда рандомно.

ps:

Конструкция вида:

C#
1
2
3
GC.Collect();
                        GC.WaitForPendingFinalizers();
                        GC.Collect();
не работает, память постоянно растет до полного прогона ВСЕХ полученных данных.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.12.2016, 07:01
Ответы с готовыми решениями:

Потребление памяти
Здравствуйте! Озадачился оптимизацией потребления памяти, поэтому подскажите, каким способом можно узнать сколько некоторые части кода...

Потребление памяти и ресурсов процессора
Пишу программу. Можно ли узнать и записать в переменную сколько она использует памяти и на сколько нагружает процессор? Добавлено...

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

15
907 / 664 / 318
Регистрация: 23.10.2016
Сообщений: 1,543
19.12.2016, 08:07
Цитата Сообщение от Hermein Посмотреть сообщение
создаваемые классы Dispos-ятся
Dispose не имеет прямого отношения к сборке мусора.
Цитата Сообщение от Hermein Посмотреть сообщение
не работает, память постоянно растет
Чтобы эта конструкция удалила объект, необходимо, чтобы в программе не было ссылки на этот объект. (КО)
0
Эксперт .NET
 Аватар для Usaga
14103 / 9320 / 1349
Регистрация: 21.01.2016
Сообщений: 35,015
19.12.2016, 08:12
Hermein, как уже верно заметили, скорее всего имеет место быть куча "висячих" ссылок. Где-то в коде (наверняка в упомянутом выше цикле) в коллекцию набиваются данные и остаются там даже после того, как становятся ненужными.

Нужно внимательно изучить код или пройтись профилировщиком.
0
 Аватар для Hermein
99 / 43 / 16
Регистрация: 25.10.2011
Сообщений: 246
19.12.2016, 08:22  [ТС]
Цитата Сообщение от TopLayer Посмотреть сообщение
тобы эта конструкция удалила объект, необходимо, чтобы в программе не было ссылки на этот объект
ради эксперимента уже ставил в методах:
C#
1
2
3
list.Clear();
list = null;
и dict.Clear(); dict=null;
соответственно - вообще ноль эффекта

Добавлено через 8 минут
В дополнение повторюсь - при старте ест очень много, после первого прогона перестает кушать в таких масштабах, думаю мало ли кто сталкивался и знает решение проблемы.
0
Эксперт .NET
 Аватар для Usaga
14103 / 9320 / 1349
Регистрация: 21.01.2016
Сообщений: 35,015
19.12.2016, 08:24
Цитата Сообщение от Hermein Посмотреть сообщение
соответственно - вообще ноль эффекта
Вывод: проблема в другом месте. Ну и обнуление ссылки не есть команда сборщику мусора сразу же браться за работу.

Добавлено через 54 секунды
Цитата Сообщение от Hermein Посмотреть сообщение
думаю мало ли кто сталкивался и знает решение проблемы.
Я сталкивался. И решение я уже сказал - профилировать и изучать код. Где-то что-то у тебя не так.
0
907 / 664 / 318
Регистрация: 23.10.2016
Сообщений: 1,543
19.12.2016, 08:28
Цитата Сообщение от Hermein Посмотреть сообщение
и прогоняет их в цикле Parallel.For
Если в качестве обработчика назначено лямбда выражение, то следует посмотреть - не создаются ли ссылки на объекты неявно, через замыкание.
0
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,045
Записей в блоге: 1
19.12.2016, 08:40
Usaga, кстати вопрос: а как вообще можно отследить висящие ссылки?
Ну, к примеру, открыто у меня одно окошко, а перед этим я наоткрывал и назакрывал кучу дочерних, насоздавал и вроде назакрывал кучу потоков в async.

Добавлено через 1 минуту
Цитата Сообщение от Usaga Посмотреть сообщение
профилировать
это вроде помогает узнать текущее потребление ресурсов. А можно ли узнать какие вообще в данный момент ресурсы задействованы и кем?
0
 Аватар для Hermein
99 / 43 / 16
Регистрация: 25.10.2011
Сообщений: 246
19.12.2016, 09:03  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Я сталкивался. И решение я уже сказал - профилировать и изучать код
проблематично на os x, а так же не очень логично с учетом того что после прохода память высвобождается и дальше приложение работает так же как и при старте, но без жора памяти (получает данные, обрабатывает);
Цитата Сообщение от TopLayer Посмотреть сообщение
Если в качестве обработчика назначено лямбда выражение
Создается новый класс для каждого пакета данных, обработчик находится в классе. Класс уничтожается после того как данные становятся неактуальными, созданные классы добавляются в список List, их там максимум 50 шт.

Если образно то:

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
public static List<MyClass> list = new List<MyClass>();
 
class MyClass:IDisposable
{
  string ss;
  int dd;
  Dictionary dict;
  public int Method()
  { int res=0;
      //делаем разные действия и возвращаем int key
      dict.Clear();
      return res;
  }
  public void Dispose()
 {
  //удаляем все и вся
 }
public static void Main()
{
   while(start)
   {
     var lst= Get();//получаем список данных
     foreach(var line in lst)
     {
        list.add(new MyClass(line));
     }
  
      Parallel.For(0,list.Count,o,line=>{
         var key = list[line].Method();
         swich(key)
        {
         ///case: 1-10 break;
        }
      });
      //Пока сюда дотопает в момент старта потребление вырастает до 4 гигов
      Thread.Sleep(1000);
     //дальше не больше 300 метров
   }
}
}
Добавлено через 5 минут
ps: при запуске на маке такой проблемы нет, возникает при запуске на Ubuntu Server 14.04, версии mono одинаковые

Добавлено через 4 минуты
забыл добавить: после Thread.Sleep идет цикл foreach по list и вызывает Dispose, после прохода коллекция очищается (list.Clear() и собственно цикл начинается заново
0
907 / 664 / 318
Регистрация: 23.10.2016
Сообщений: 1,543
19.12.2016, 09:05
А можно узнать чему равно o в 28 строке?
0
Эксперт .NET
 Аватар для Usaga
14103 / 9320 / 1349
Регистрация: 21.01.2016
Сообщений: 35,015
19.12.2016, 09:38
skilllab, профилировщики такую детальную информацию не предоставляют. Вывод о наличие "висяков" можно сделать глянув на расход памяти - если он постоянно растёт, то имеет место "зависание" ссылок. Единственное, что профилировщики позволяют посмотреть каких типов объекты создаются, примерно где, и сколько. От этого уже и плясать. К примеру увидев, что у тебя есть пятнадцать объектов MyUberClass, хотя ты в логику закладывал создание только одного, можно сделать выводы.

Я для профилировки пользовался такой бесплатной штукой от майкрософт - CLR Profiler. Это была боль. Но даже оно мне иногда показывало удивительные вещи (типа того: замена Console.WriteLine(someString + "r\n") на Console.WriteLine(someString);Console.Wr iteLine("r\n") приводило к экономии сотни мегабайт памяти перерабатываемой сборщиком). Думаю платные профилировщики могут на порядок больше, но я ими не пользовался, ибо особой необходимости не было.

Добавлено через 24 минуты
Hermein, я думаю, что если ты сможешь порезать свой проект до минимума на котором проблема воспроизводится и выложить на форум, то добрые люди (с виндой) с удовольствием посмотрят и попрофилируют. По крайней мере, это намного интереснее, чем сортировать файлы и создавать класс Student.
2
 Аватар для Hermein
99 / 43 / 16
Регистрация: 25.10.2011
Сообщений: 246
21.12.2016, 03:38  [ТС]
Usaga, а что если выпиливать по-1 классу из проекта чтобы определиться где поедает?
0
Эксперт .NET
 Аватар для Usaga
14103 / 9320 / 1349
Регистрация: 21.01.2016
Сообщений: 35,015
21.12.2016, 03:50
Hermein, насколько я понял по твоему описанию, потребление памяти находится где-то в районе чтения данных из БД и обработки их в параллельном цикле. Вот там и нужно копаться. Рандомно что-то резать - неэффективно и бессмысленно.

Может у тебя запросы фиговые и ты всю базу за раз выгребаешь? Или ещё чего странного делаешь. Гадать можно долго. Давай код.
0
 Аватар для Hermein
99 / 43 / 16
Регистрация: 25.10.2011
Сообщений: 246
21.12.2016, 08:37  [ТС]
Usaga, Именно на моменте обработки и именно на старте приложения, 10 классов авторизации/парсинга/обработки, около 250 методов, так что я подумал что проще вырезать по-1 классу (либо все и вставлять по-1), но не очень уверен в эффективности метода. А так у меня проект модульный и убрать/добавить класс нет никаких проблем.
0
Эксперт .NET
 Аватар для Usaga
14103 / 9320 / 1349
Регистрация: 21.01.2016
Сообщений: 35,015
21.12.2016, 08:57
Hermein, поочерёдно вырезать участки и смотреть, что будет - крайне неэффективно и долго.

Добавлено через 1 минуту
Смотри, что нашлось на сайте Mono. Может оно тебе поможет.
0
 Аватар для Hermein
99 / 43 / 16
Регистрация: 25.10.2011
Сообщений: 246
21.12.2016, 08:59  [ТС]
Usaga, почему же? Оставить только авторизацию, а все остальное отрубить и посмотреть как себя будет вести - если так же, то проблема явно в авторизации (есть такие сомнения, так как ответ проходит через 2-3 десятка public static void методов)
0
Эксперт .NET
 Аватар для Usaga
14103 / 9320 / 1349
Регистрация: 21.01.2016
Сообщений: 35,015
21.12.2016, 09:07
Hermein, потому, что посмотреть и проанализировать результаты профилирования будет на порядки быстрее. Единственный грамотный подход. Не нужно ерундой заниматься.

Добавлено через 1 минуту
Просто выбор кусков кода на "отрубание" основывается на догадках, предположениях и рандоме. А так ты точно увидишь, что у тебя там-то и там-то создаёт дохреналион объектов, которых, по идее, должно быть пять (к примеру).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.12.2016, 09:07
Помогаю со студенческими работами здесь

Большое потребление памяти при вызове метода
Наблюдаю очень странное поведение Visual Studio 2008. В моём проекте на C# есть один метод, который содержит большое число кода (циклы,...

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

Оптимизировать потребление памяти
В вузе лаба: реализовать вращающийся текст на форме, создав пользовательский элемент управления, наследуясь от control. Как бы всё...

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

Чрезмерное потребление оперативной памяти
Пытаюсь получить html страницы в фейсбуке в цикле. Для этого использую webbrowser. Получить, то получаю, но проблема в том, что цикл может...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru