Освобождение памяти ArrayResize и ArrayRemove.

 

Имеется массив MqlTick. Данный массив хранит тики за продолжительный период (запрос CopyTicksRange выполняется долго и для минимизации вызова данной функции, тики копируются с большим запасом). После того, как старые тики более не нужны, произвожу удаление старых тиков функцией ArrayRemove. Однако, высвобождения памяти не происходит. Так же как и при ручном сдвиге массива и изменением размера при помощи ArrayResize. Приходится вставлять костыль вроде:

MqlTick ticks[]

CopyTicksRange(.....);

.....

MqlTick cleared_ticks[];

ArrayResize(cleared_ticks, ticks_left);

for (int i = 0; i < ticks_left; ++i)

  cleared_ticks[i] = ticks[i + ticks_left];

ArrayFree(ticks);

ArrayCopy(ticks, cleared_ticks);

ArrayFree(cleared_ticks);


Подобная конструкция ужасна и неэффективна. Как заставить высвобождать память функциямми ArrayRemove или хотя бы ArrayResize??? 

 
Документация по MQL5: Общие функции / ZeroMemory
Документация по MQL5: Общие функции / ZeroMemory
  • www.mql5.com
ZeroMemory - Общие функции - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 

Причем тут ZeroMemory? Мне нужно не занулить массив тиков, а освободить память от не используемых элементов. Физически освободить.

 
Вадим Калашнков #:

Причем тут ZeroMemory? Мне нужно не занулить массив тиков, а освободить память от не используемых элементов. Физически освободить.

Ну название этой функции говорит что делает именно то что вам нужно, врёт!?
 
Ещё как вариант создать класс и туда запихнуть массив создание new удаление delete вроде быстро должно получиться.
 
Новая версия платформы MetaTrader 5 build 2007: Экономический календарь, MQL5-программы в виде сервисов
Новая версия платформы MetaTrader 5 build 2007: Экономический календарь, MQL5-программы в виде сервисов
  • 2019.03.14
  • www.mql5.com
21 февраля 2019 года будет выпущена обновленная версия платформы MetaTrader 5...
 
Alexey Valeev #:
Ну название этой функции говорит что делает именно то что вам нужно, врёт!?

"[in] [out] Переменная, передаваемая по ссылке, которую требуется обнулить (инициализировать нулевыми значениями)."
Данная функция обнуляет переменные. Т.е. если у вас было int array[3] = {1, 2, 3}, после вызова ZeroMemory(array), во всех 3 элементах будут нули.

 

Спасибо, видимо без костылей никак, но с ArraySwap легче.

 

Освобождение памяти MQL5 программы не возвращает ее в операционную систему, а оставляет в своих пулах памяти для последующего использования.


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

Поэтому в MQL5 используются свои специфические пулы памяти под разные задачи и типы данных. Их цель - обеспечить максимальную скорость выделений/удалений/перевыделений и быть отделенными от основной памяти терминала, чтобы обеспечить песочницу.

Не надо думать, что TerminalInfoInteger(TERMINAL_MEMORY_USED) или TerminalInfoInteger(TERMINAL_MEMORY_AVAILABLE) обязаны показывать "правильные" с вашей точки зрения данные.

 
Вадим Калашнков #:

Спасибо, видимо без костылей никак, но с ArraySwap легче.

Так это не костыль, это фича от разрабов. Если передать reserve -1 то разница между реальной и используемой памятью схлопывается. это же ответ на вопрос почто точь-в-точь совпадающий с вашим.

 
Andrei Trukhanovich #:

Так это не костыль, это фича от разрабов. Если передать reserve -1 то разница между реальной и используемой памятью схлопывается. это же ответ на вопрос почто точь-в-точь совпадающий с вашим.

Да, ArrayResize(arr,0,-1) - это специальный случай для освобождения/отвязки памяти от массива.

Но память все равно возвращается в один из MQL5 пулов, если это не большой кусок памяти. Большие куски памяти выделяются у операционки, так как для них нет эффекта от использования пула.

Причина обращения: