Вопрос по массивам - страница 2

 
Ihor Herasko:

А если использовать:

то сколько будет? ))))

хм, не знаю, я об этой директиве прекомпилятора вот только и узнал (((

Стек

В каждой MQL4-программе под хранение локальных автоматически создаваемых переменных функций выделяется специальная область памяти, называемая стеком. Стек выделяется один на все функции и по умолчанию размер стека составляет 256 kb, размером стека можно управлять директивой компилятора #property stacksize.

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

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

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

Поэтому для больших локальных данных лучше использовать динамическую память - при входе в функцию память под локальные нужды выделять в системе (new, ArrayResize()), а при выходе из функции производить освобождение памяти (delete, ArrayFree()).

попробовал добавить

#property stacksize 999999999

все равно ругается компилятор на массив более 512 кб

 
Igor Makanu:

512 кБ = 524288 байт 

double 8 байт

524288 / 8 = 65536 

для double максимальный массив может быть лишь такой: 

но компилятор с таким объявлением массива не пропускает, методом научного тыка было найдено вот такое максимальное значение:

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

double Ticks[1024*1024*128]; // еще можно, но не нужно ))
 
Alexey Volchanskiy:

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

ну как бы топикстартер решил крешить терминал вот таким изящным способом, а мы все стараемся ему помочь

))))

ЗЫ: тики писать нужно примерно так: пишем новые тики в массив на пару килобайт, и делаем инкремент счетчика следующего элемента массива, и при заполнении массива сбрасываем массив в файл, ну и я бы вообще сбрасывал бы массив в файл через OnTimer() один раз несколько в минут -и система не перегружена и данные сохранены. Тики обычно один тик в секунду, ну пусть с запасом на экстренные ситуации берем по 200 тиков в минуту - т.е. массива на 1000 элементов все равно хватит. 

 
Ihor Herasko:

А если использовать:

то сколько будет? ))))

Вопрос хороший

Сколько, если не секрет?

 
Igor Makanu:

512 кБ = 524288 байт 

double 8 байт

524288 / 8 = 65536 

для double максимальный массив может быть лишь такой: 

но компилятор с таким объявлением массива не пропускает, методом научного тыка было найдено вот такое максимальное значение:


если предположить, что один тик в секунду прилетает в среднем, то за сутки будет 86 400 секунд , даже такой массив double не пропустит компилятор

Насколько я помню 4кб *.txt - это одна страница

то есть 65536 - максимум?

 
Renat Akhtyamov:

Насколько я помню 4кб *.txt - это одна страница

то есть 65536 - максимум?

Только в 1-байтовой ANSI кодировке.

 
Зачем Вам много курсов в памяти скрипта MQL? Складывайте сразу на диск, в выходные обработаете как надо. И необязательно в MQL, есть языки, где можно спокойно поднять в память 400 Мб одним сплошным куском. А все значащие цифры курса помещаются с запасом в три байта, если курсы умножать на миллион (на 10 тыс. для йены).
 
Vladimir:
Зачем Вам много курсов в памяти скрипта MQL? Складывайте сразу на диск, в выходные обработаете как надо. И необязательно в MQL, есть языки, где можно спокойно поднять в память 400 Мб одним сплошным куском. А все значащие цифры курса помещаются с запасом в три байта, если курсы умножать на миллион (на 10 тыс. для йены).

предполагается обработка всех значений цены из массива на текущий момент времени в комплексе

и чем больше значений, тем лучше

подгрузить можно, не спорю

но какой смысл постоянно перезаписывать файл?

значит если умножать на миллион то можно создать массив примерно в 170 тысяч строк?

 
Здесь написано, что максимальный размер массива 2147483647 элементов. 
Документация по MQL5: Операции с массивами / ArrayResize
Документация по MQL5: Операции с массивами / ArrayResize
  • www.mql5.com
При успешном выполнении функция возвращает количество всех элементов, содержащихся в массиве после изменения размера; в противном случае возвращает -1 и массив не меняет размеры. Если ArrayResize() применена к статическому массиву, таймсерии или индикаторному буферу, то размер массива остается прежним – такие массивы не могут быть...
 
Sergey Savinkin:
Здесь написано, что максимальный размер массива 2 147 483 647 элементов. 

ок, спасибо

это очень круто!

2 с лишним миллиарда !!!!

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