Ошибка выделения памяти

 
Добрый день.
Пишу мультитаймфреймовый советник. Для получения котировок с разных ТФ использую функцию АrrауCopyRates
Индикаторы с ТФ расчитываются и хранятся в советнике в массивах, для ускорения доступа к их значениям.
Размеры индикаторных массивов приводятся в соответствие с количеством баров на каждом ТФ конструкцией
    ArraySetAsSeries(iArray,false); 
    ArrayResize(iArray, iBars(Symb, tf));
    ArraySetAsSeries(iArray,true); 
После запуска советник работает нормально. Однако спустя несколько часов в журнале терминала появляется вот такая ошибка:

2010.04.14 12:51:17 Memory handler: cannot allocate 3089960 bytes of memory

С чем это связано, и как с этим бороться?
 
lusp >>:
Добрый день.
Пишу мультитаймфреймовый советник. Для получения котировок с разных ТФ использую функцию АrrауCopyRates
Индикаторы с ТФ расчитываются и хранятся в советнике в массивах, для ускорения доступа к их значениям.
Размеры индикаторных массивов приводятся в соответствие с количеством баров на каждом ТФ конструкцией
После запуска советник работает нормально. Однако спустя несколько часов в журнале терминала появляется вот такая ошибка:

2010.04.14 12:51:17 Memory handler: cannot allocate 3089960 bytes of memory

С чем это связано, и как с этим бороться?

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

 

Оперативки не хватает.

 
массивы лучше использовать впритык по потребностям, то есть если у вас используются 2 разных тайфрейма с разными количествами баров, то само собой они не должны быть использованы в одном многомерной массиве. Если часть данных уже не нужна то это тоже нужно учесть.
 
Массивы порядочные, но инициализируются на весь объем в init эксперта. Потом к ним по мере появления добавляются только значения для новых баров. Однако ошибка появляется не сразу, а спустя несколько часов после старта эксперта. При этом объем памяти занимаемой терминалом медленно растет. Если терминал перезагрузить, то ошибки выделения памяти пропадут на несколько часов, хотя все массивы проинициализировались на новое значение количества баров.

Может где-то что-то надо освобождать принудительно?
 
lusp писал(а) >>
Массивы порядочные, но инициализируются на весь объем в init эксперта. Потом к ним по мере появления добавляются только значения для новых баров. Однако ошибка появляется не сразу, а спустя несколько часов после старта эксперта. При этом объем памяти занимаемой терминалом медленно растет. Если терминал перезагрузить, то ошибки выделения памяти пропадут на несколько часов, хотя все массивы проинициализировались на новое значение количества баров.

Может где-то что-то надо освобождать принудительно?


Не надо увеличивать массив. Сдвигать значения.
 
Integer >>:

Оперативки не хватает.


Это-то понятно. Вопрос как ее родимую, освобождать вовремя. При старте терминала он занимает порядка 100 МБ оперативки. Потом это значение растет до тех пор, пока не займет ее всю. Тогда и появляется ошибка
 
lusp >>:
Добрый день.
Пишу мультитаймфреймовый советник. Для получения котировок с разных ТФ использую функцию АrrауCopyRates
Индикаторы с ТФ расчитываются и хранятся в советнике в массивах, для ускорения доступа к их значениям.
Размеры индикаторных массивов приводятся в соответствие с количеством баров на каждом ТФ конструкцией
После запуска советник работает нормально. Однако спустя несколько часов в журнале терминала появляется вот такая ошибка:

2010.04.14 12:51:17 Memory handler: cannot allocate 3 089 960 bytes of memory

С чем это связано, и как с этим бороться?

Зачем вам ВСЕ значения по всей истории в советнике?

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

Еще. Если вы перенесете в индикаторы то, что вы делаете сейчас в советнике, то проблема, скорее всего, будет устранена.

 
Integer >>:


Не надо увеличивать массив. Сдвигать значения.


Мысль интересная, надо будет попробовать. А как быть с функцией ArrayCopyRates? Она же свои массивы сама раздвигает
 
lusp писал(а) >>


Мысль интересная, надо будет попробовать. А как быть с функцией ArrayCopyRates? Она же свои массивы сама раздвигает


Брать данные через функции типа iClose(...)

 
lusp >>:


Мысль интересная, надо будет попробовать. А как быть с функцией ArrayCopyRates? Она же свои массивы сама раздвигает


#define num 60 //количество элементов в массиве, 60 -вроде как 60 сек или мин  :)
static double Mass[num];

.................
ArrayCopy(Mass,Mass,0,1,WHOLE_ARRAY); //сдвигаем массив на одну позицию
.......................
Причина обращения: