Потребление памяти терминалом - страница 3

 
Yedelkin:
...Заключается она в том, что если для загрузки индикатора требуется и время, и ресурсы (с чем никто не и спорит), то желательно сделать это однократно при запуске программы, которая вызывает эти самые индикаторы. Т.е. в OnInit().  Образно говоря, "потерпеть пять минут при запуске основной программы, а потом спокойно пользоваться"...
С таким подходом согласен. Так и делаю. Правда дело в том, что иногда терминал не справляется с загрузкой всех индикаторов. Просто виснет... Вопрос к разработчикам - стоит ли улучшать аппаратную составляющую (оперативку, скорость CPU, etc.) ?
 
denkir:
С таким подходом согласен. Так и делаю. Правда дело в том, что иногда терминал не справляется с загрузкой всех индикаторов. Просто виснет... Вопрос к разработчикам - стоит ли улучшать аппаратную составляющую (оперативку, скорость CPU, etc.) ?

Тут уже давали ссылку, оптимизировать надо код - https://www.mql5.com/ru/articles/259.

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

Уменьшаем расход памяти на вспомогательные индикаторы
Уменьшаем расход памяти на вспомогательные индикаторы
  • 2011.03.18
  • Andrew
  • www.mql5.com
Если индикатор для своих расчетов задействует значения множества других индикаторов, то такая система расходует много памяти. В статье рассмотрены несколько способов снижения расхода памяти при использовании вспомогательных индикаторов. Сэкономленная память позволит вам увеличить число одновременно используемых в терминале валютных пар, индикаторов и стратегий, что повысит надежность вашего торгового портфеля. Вот так простая забота о технических ресурсах вашего компьютера способна превратиться в материальные ресурсы на вашем депозите.
 

Убил пол ночи. Злой - слов нет. Делюсь результатами:

//+------------------------------------------------------------------+
//|                                                  iMemoryTest.mq5 |
//|                                        Copyright 2012, komposter |
//|                                         http://www.komposter.me/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2012, komposter"
#property link      "http://www.komposter.me/"
#property version   "1.0"

#property indicator_separate_window
#property indicator_plots       0

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{
   // Эта строка съедает 5 (физической) + 5 (из файла подкачки) = 10 Мб памяти!
   ObjectCreate( 0, "iMemoryTest", OBJ_LABEL, 0, 2, 2 );

   return(0);
}
 
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
  {
//---
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }

 

Этот пустой индюк, создающий один объект, жрет 10 Мб памяти.

Если объект убрать, потребление памяти падает практически до 0 (как замерить точно - не знаю).

 

Обидно - не то слово. Я сижу оптимизирую буферы, доступ к другим индикаторам... а проблема в одном единственном объекте-метке.

 
komposter:

Если объект убрать, потребление памяти падает практически до 0 (как замерить точно - не знаю).

Интересный эффект. 

Если не создавать объекта, т.е. закомментировать ObjectCreate в вашем примере, то выделение памяти при старте индикатора действительно мизерное.

Но, после удаления этого индикатора с графика, почему-то происходит выделение памяти, причем на уровне, как если бы мы создавали объект (~10Мб).

 
komposter:

Если объект убрать, потребление памяти падает практически до 0 (как замерить точно - не знаю).

 так хочеш загрузит история с 1970г   ....

 Если заменит точка привязки на TimeCurrent() / Bid ( наместо 2 / 2) сколько памят потребляет ?


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

Когда добавляете 200 000 объектов на чарт, а потом все это быстро работает, почему так происходит? Дело в том, что внутри проведена огромная работа по тюнингу производительности ради возможности работы с сотнями тысяч объектов.
 
Renat:
А о кешах задумываетесь? Кеш выделяется даже при выделении одного обьекта.

Когда добавляете 200 000 объектов на чарт, а потом все это быстро работает, почему так происходит? Дело в том, что внутри проведена огромная работа по тюнингу производительности ради возможности работы с сотнями тысяч объектов.

В настройки компилятора это может быть вынесено?

Или "Заткнулись, и жрем!" (с)?

 
komposter:

В настройки компилятора это может быть вынесено?

Или "Заткнулись, и жрем!" (с)?

А разве кэш не вытесняемый? Ну тоесть когда память нужна, урезаем кэш, память не нужна, раздуваем?

И еще, добавление последующих объектов ведь не съедает столько же памяти, это скорее начальная инициализация примочек, иначе бы и пару тысяч объектов не создать. (2000 х 5Мб = 10Гб) в своп бы глубоко ушли

 
Renat:
 А о кешах задумываетесь?

Может есть смысл рассказать как реализовано кэширование более подробно, а лучше описать в справке, чтобы предупредить вопросы  по этой теме  в будущем.

Беру к примеру справку для ObjectDelete.

Написано:

Возвращает true при успешном завершении операции удаления, в противном случае false. 

Но это же неправда.

Этот объект ставится в очередь на удаление и true возвращается при успешной постановке в очередь а не при удалении. Т.е. это разные события.

А о том когда освобождается память, выделенная под этот объект я вообще незнаю. А хотелось бы знать.

Но почему бы не написать правду прямо в справке. Это относится и кэшам тоже, и ко всему что вызывает вопросы.

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

Тогда мы бы читали справку а не эти форумы в поисках правды.

А ваши ответы, Ренат, стали бы очень простыми: "Читайте справку"!

Это написано без негатива, просто хочется огранить камень.

 

 
avoitenko:

Но, после удаления этого индикатора с графика, почему-то происходит выделение памяти, причем на уровне, как если бы мы создавали объект (~10Мб).

У меня не воспроизводится. Может, у вас что-то другое "оживает"?
Причина обращения: