Особенности языка mql5, тонкости и приёмы работы - страница 265

 
Vladislav Boyko #:

Не знаю, почему для 1000001 и 1000002 у вас теперь одинаково. У меня все как ожидалось:

думаю, грешить надо на работу MQLInfoInteger(MQL_MEMORY_USED) и  TerminalInfoInteger(TERMINAL_MEMORY_USED)

 
Vladislav Boyko #:

А вы откуда запускаете? Наверное start_mem не равна нулю потому, что в программе еще что-то есть, кроме кода, который вы публикуете.

Напечатайте start_mem тоже

запускаю с пустого скрипта

void OnStart() {
   int start_mem = MQLInfoInteger(MQL_MEMORY_USED);
   int arr[];
   ArrayResize(arr,1,1e7);
   Print(string(MQLInfoInteger(MQL_MEMORY_USED)-start_mem)+" Mb");
   ArrayResize(arr,1,1e7);
   Print(string(MQLInfoInteger(MQL_MEMORY_USED)-start_mem)+" Mb");
   ArrayResize(arr,1000000,1e7);
   Print(string(MQLInfoInteger(MQL_MEMORY_USED)-start_mem)+" Mb");
   ArrayResize(arr,1000001,1e7);
   Print(string(MQLInfoInteger(MQL_MEMORY_USED)-start_mem)+" Mb");
   ArrayResize(arr,1000002,1e7);
   Print(string(MQLInfoInteger(MQL_MEMORY_USED)-start_mem)+" Mb");
   ArrayResize(arr,2000000,1e7);
   Print(string(MQLInfoInteger(MQL_MEMORY_USED)-start_mem)+" Mb");
   ArrayResize(arr,2000001,1e7);
   Print(string(MQLInfoInteger(MQL_MEMORY_USED)-start_mem)+" Mb");
   ArrayResize(arr,10000001,1e7);
   Print(string(MQLInfoInteger(MQL_MEMORY_USED)-start_mem)+" Mb");
   ArrayResize(arr,10000002,1e7);
   Print(string(MQLInfoInteger(MQL_MEMORY_USED)-start_mem)+" Mb");
   ArrayResize(arr,20000002,1e7);
   Print(string(MQLInfoInteger(MQL_MEMORY_USED)-start_mem)+" Mb");
   ArrayResize(arr,20000003,1e7);
   Print(string(MQLInfoInteger(MQL_MEMORY_USED)-start_mem)+" Mb");
}
 

А, наверное это происходит потому, что 1Mb = 2^20 = 1048576 байт

тогда все норм

правда все равно не понятно, почему при каждой итерации увеличения выделяемой памяти происходит смещение на 1 единицу
 
Nikolai Semko #:

А, наверное это происходит потому, что 1Mb = 2^20 = 1048576 байт

тогда все норм

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

 
fxsaber #:

Тиковый мультивалютный Тестер. Запрашиваете тики по одному символу (50% RAM), затем фильтруете их (10% RAM). Тоже самое по другим символам. Если в фильтре тики не ужимаются физически, то нехватка памяти на стадии подготовки данных. 

Т.е. для каждого символа отдельный массив и фильтрация в исходном массиве происходит?

 
Aleksey Vyazmikin #:

Т.е. для каждого символа отдельный массив и фильтрация в исходном массиве происходит?

Конечно.

 
fxsaber #:

Конечно.

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

 
Aleksey Vyazmikin #:

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

это как ?

 
Maxim Kuznetsov #:

это как ?

В цикле?

 
Aleksey Vyazmikin #:

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

Есть 20 гигов памяти. Нужен мультивалютник по пяти символам. Тиковая история каждого кушает 5 гигов.

Для каждого символа берется 5 гигов его истории и превращается в 0.5 гига после фильтрации.