Не раздвигается массив и Ошибка Out of memory

 

В описание сказано ArrayResize возвращает -1 если не удалось изменить размер массива.

Общее число элементов в массиве не может превышать 2147483647.

1. Если максимальное число элементов не достигнуто, то по какой причине размер массива не удается изменить?  

2. Вот такая строка должна выделять память под массив максимального размера ArrayResize(RezutDataObj,arrsize+1, 2147483647);    У меня после небольшой работы массив раздвигается до 600 тыс элементов и возникает ошибка ошибка Out Of memory. (Хотя на сервере опертивки 12 гб)

3. Если использовать ArrayResize(RezutDataObj,arrsize+1, 100000), То после 400 000 тыс элемента возникает ошибка. Невозможно изменить размер массива.  

 

У меня в коде массив структуры, который в себе так же содержит массив элементов.

struct RezutData

  {

   int               arr[500];

   int               sovpadeniy;

   int               dlina;

  }; 

...

RezutData RezutDataObj[];

... 

 arsizerezult=ArraySize(RezutDataObj);

 int temp= ArrayResize(RezutDataObj,arsizerezult+1, 2147483647); 

 

 Подскажите в чем может быть проблема?


 
А структура сколько байт занимает и какое значение получится, если умножить его на 2 млрд?
 

int - 4 байта,

массив из 500 int - 2000 байт.

Вся структура - это массив и 2 int  = 2008 байт. 

 

В моем случае массив раздвигается примерно до 600 000 элементов, т.е. 1.12 гб. (Если я не ошибся в арифметике)  

 А потом массив не раздвигается. Это предел программы?  

 

 

Уточнения.

1. Массив не может быть раздвинут - если  нет памяти выделенной windows под данное приложение?  (А еще часть памяти занимает сам МТ4, графики, бары, значения индикаторов и остальное?)

2. Сколько памяти может использовать МТ4? Как то можно сделать проверку на наличие свободной памяти?

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

 

MetaTrader 4 - это 32 битное приложение и в 32 битной операционке может выделить под себя до 3х гб. В 64 битной операционке до 4гб (мы используем large address настройки для 32 битных приложений, что позволяет выйти за пределы официальных 2Gb).

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

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

Вообще это безумие пытаться выделять такого (512mb и выше) размера блоки в 32 битных приложениях, так как почти гарантированно можно получить отказ из-за фрагментации памяти. Такое можно делать в 64 битных операционках при заведомо кратно бОльших объемах памяти. В 32 битных операционках нужно использовать блоки меньшего размера и применять специальную архитектуру хранения больших объемов в виде кусков.

 

У меня Win 8 64 бит. 

Как тогда лучше действовать?  Выделять память меньшими блоками, например по 1мб? Как то можно сделать проверку на наличие свободной памяти?

Если советник забивает всю память (как в моем случае) под массив. Сам МТ4 будет корректно работать?  

 
dr0:

У меня Win 8 64 бит. 

Как тогда лучше действовать?  Выделять память меньшими блоками, например по 1мб? Как то можно сделать проверку на наличие свободной памяти?

Если советник забивает всю память (как в моем случае) под массив. Сам МТ4 будет корректно работать?  

У вас МТ4 32 битный.

Выделяйте блоки вплоть до 128-256 мб - это должно нормально работать. Я писал про проблемы на огромных блоках по 512 мб и выше.

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