Скачать MetaTrader 5

ArrayResize не увеличивает количество элементов первого измерения динамического массива вида MyArray[][7][1440].

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Нужно пополнить счет? Пополняй удобным тебе способом!
Justinas Shimkus
179
Justinas Shimkus 2016.04.18 21:33 

ArrayResize не увеличивает количество элементов первого измерения динамического массива вида double MyArray[][7][1440]. Причем, если использовать ArrayResize(MyArray, 10000), то ArrayRange(MyArray, 0) покажет 10000. А если ArrayResize(MyArray, 100000), то ArrayRange(MyArray, 0) покажет 0. От 100000 я шел на уменьшение, но прошел недолго, например при 35000 он тоже не изменяет кол-во элементов первого измерения. Указано ограничение на количество элементов массива - 2147483647. Это имеется ввиду по одному из измерений или общее число элементов по всем измерениям ? Даже если по всем, то при MyArray[100000][7][1440] общее число что-то вроде 1000000000, что почти в 2 раза меньше 2147483647.

Как быть ? 

Dmitry Fedoseev
42894
Dmitry Fedoseev 2016.04.18 22:23  

Ограничение на размер массива не по количеству элементов, даже нет ограничения непосредственно на один массив. Ограничение на общий объем переменных объявленных в эксперте.

Зачем вообще такие громадные массивы? Изначально неправильный алгоритмический подход. Ищите другой алгоритм.

MetaQuotes
Админ
24947
Renat Fatkhullin 2016.04.18 22:43  

double MyArray[100000][7][1440] = 8 * 100 000 * 7 * 1440 = 8 Gb.

Вообще такие объемы можно выделить только в MetaTrader 5 x64. Причем динамически, а не на стеке.

Artyom Trishkin
Модератор
75699
Artyom Trishkin 2016.04.18 22:43  
ArkFatalist:

ArrayResize не увеличивает количество элементов первого измерения динамического массива вида double MyArray[][7][1440]. Причем, если использовать ArrayResize(MyArray, 10000), то ArrayRange(MyArray, 0) покажет 10000. А если ArrayResize(MyArray, 100000), то ArrayRange(MyArray, 0) покажет 0. От 100000 я шел на уменьшение, но прошел недолго, например при 35000 он тоже не изменяет кол-во элементов первого измерения. Указано ограничение на количество элементов массива - 2147483647. Это имеется ввиду по одному из измерений или общее число элементов по всем измерениям ? Даже если по всем, то при MyArray[100000][7][1440] общее число что-то вроде 1000000000, что почти в 2 раза меньше 2147483647.

Как быть ? 

Используйте массив структур
Stanislav Korotky
17910
Stanislav Korotky 2016.04.19 11:49  
Для начала попробуйте заменить double на float и посмотрите, какой размер станет доступным.
Justinas Shimkus
179
Justinas Shimkus 2016.04.19 15:47  
Большое спасибо всем, буду менять алгоритм. И 100000 я привел как пример - мне же в последствии нужно будет куда больше.
Vasiliy Sokolov
21733
Vasiliy Sokolov 2016.04.19 16:49  
ArkFatalist:
Большое спасибо всем, буду менять алгоритм. И 100000 я привел как пример - мне же в последствии нужно будет куда больше.

На лицо неправильно выбранный метод для решения задачи.

У Вас есть некая задача, Вы придумали метод по ее решению. Оказалось, что он не работает. Вы пишете на форуме, с просьбой помочь исправить метод. Вам подсказывают и помогают его исправить, тогда как изначально нужно выбрать иной метод для реализации задачи. Правильный вопрос, который не был Вами задан, заключается в следующем: "как найти решение моей задачи?", а не "почему этот метод не работает?"

Alexey Volchanskiy
16672
Alexey Volchanskiy 2016.04.22 09:40  
ArkFatalist:
Большое спасибо всем, буду менять алгоритм. И 100000 я привел как пример - мне же в последствии нужно будет куда больше.

Тогда оперативки никак не хватит. Как вариант, можно использовать Memory mapping, там можно сделать доступ, как к одномерному массиву. Ну а из одномерного пересчитать в 3-х мерный не трудно.

В ММ, на некотором уровне заполнения оперативки, винда станет выделять виртуальную память с диска. Объемы там до 64-битного адреса

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