Russian Qt Forum
Ноябрь 24, 2024, 20:31 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2] 3 4   Вниз
  Печать  
Автор Тема: максимальное количество елементов в двумерном масиве  (Прочитано 27781 раз)
umts
Гость
« Ответ #15 : Апрель 06, 2010, 20:45 »

Может, изменить алгоритм на менее требовательный к памяти? В большинстве случаев необходимости в таких огромных массивах нет.
Записан
Ubuntu_linux
Гость
« Ответ #16 : Апрель 06, 2010, 21:15 »

Как раз мне надо ,пока что, два массива 1000*1000 (и больше) для более точного решения системы уравнений в частных производных, Но я не могу создать массивы больше 1000*1000 так как стек исчерпывается. Шокированный
Записан
alexman
Гость
« Ответ #17 : Апрель 06, 2010, 21:34 »

Как раз мне надо ,пока что, два массива 1000*1000 (и больше) для более точного решения системы уравнений в частных производных, Но я не могу создать массивы больше 1000*1000 так как стек исчерпывается. Шокированный
Динамически выделяй память!
Записан
Ubuntu_linux
Гость
« Ответ #18 : Апрель 06, 2010, 22:04 »

Я не могу понять как мне выделить память для 2-мерного массива і как потом к нему обращаться.
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #19 : Апрель 06, 2010, 22:11 »

Я не могу понять как мне выделить память для 2-мерного массива і как потом к нему обращаться.

В теме уже прозвачало 2 ответа (читай на первой странице)
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Ubuntu_linux
Гость
« Ответ #20 : Апрель 06, 2010, 22:17 »

при помощи оператора new , ето я понял, но как мне  узнать (или записать)значения элемента [55][45] ?
Код:
int **mtrx,**matr;
matr = new int* [100];
for (int i = 0; i < 100; ++i){
    mtrx[i] = new int* [ncol];}
« Последнее редактирование: Апрель 06, 2010, 22:18 от Ubuntu_linux » Записан
alexman
Гость
« Ответ #21 : Апрель 06, 2010, 22:32 »

при помощи оператора new , ето я понял, но как мне  узнать (или записать)значения элемента [55][45] ?
Код:
int **mtrx,**matr;
matr = new int* [100];
for (int i = 0; i < 100; ++i){
    mtrx[i] = new int* [ncol];}
Код:
mtrx[55][45]
Записан
alexman
Гость
« Ответ #22 : Апрель 06, 2010, 22:35 »

Кстати правильно:
Код:
int **mtrx = new int* [100];
for ( int i = 0; i < 100; ++i ) {
    mtrx[i] = new int[ncol];
}
Записан
Ubuntu_linux
Гость
« Ответ #23 : Апрель 06, 2010, 23:17 »

Все получилось, слава Богу!
Теперь максимальное количество элементов  на два массива 2*(14000*14000) ~4 миллиона элементов. Мне хватит. Спасибо всем! Подмигивающий
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #24 : Апрель 07, 2010, 04:20 »

Насколько я понял, для динамических двумерных массивов лучше так не выделять память. new - тяжелая операция и удалять потом объекты трудно. Лучше выделить сразу matr = new int* [nrow * ncol] . и потом аккуратно работать с индексами
Нет, при хороших размерах нужно выделять как указал SimpleSunny, иначе можно нарваться на отказ new и/или убить скорость. Если надо удалять/вставлять - тогда лучше контейнер, но совсем не каждый здесь подойдет. Я бы делал QList <QVector <int>>



Записан
Ubuntu_linux
Гость
« Ответ #25 : Апрель 09, 2010, 17:38 »

Все получилось, слава Богу!
Теперь максимальное количество элементов  на два массива 2*(14000*14000) ~4 миллиона элементов. Мне хватит. Спасибо всем! Подмигивающий
Сорри,  тут ошибочка вышла  всего элементов выходит 392 миллиона (~ 400 миллионов) , а если  тип чисел double  (8 байт) то получатся что массив занимает  3.1 Гб памяти.
Записан
alexman
Гость
« Ответ #26 : Апрель 09, 2010, 22:07 »

float не устоит?
Записан
niXman
Гость
« Ответ #27 : Апрель 09, 2010, 22:37 »

Ubuntu_linux, я уверен на 99%, что вашу задачу можно решить правильным способом, без экстремальной потребности в памяти Улыбающийся
а иначе, как вам раньше уже рекомендовали, купите памяти Подмигивающий
Записан
Karl-Philipp
Гость
« Ответ #28 : Апрель 10, 2010, 09:07 »

Ubuntu_linux, я уверен на 99%, что вашу задачу можно решить правильным способом, без экстремальной потребности в памяти Улыбающийся
а иначе, как вам раньше уже рекомендовали, купите памяти Подмигивающий
Уточни-ка, пожалуйста, что это за правльный способ "без экстремальной потребности в памяти"?
Записан
niXman
Гость
« Ответ #29 : Апрель 10, 2010, 09:45 »

т.к. ТС так и не описал алгоритма, требующего такого огромного, одновременно инициализированного кол-ва элементов, точный "прием" решающий его проблему, указать сложно.
но базовое направление, это "Отложенная инициализация".
Тут нашел некоторое, весьма не плохое, решение: http://butaji.wordpress.com/2009/01/02/lazy-computation-in-c-%D0%BB%D0%B5%D0%BD%D0%B8%D0%B2%D1%8B%D0%B5-%D0%B2%D1%8B%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F-%D0%B2-c/

кстати, совсем недавно, для сериализации объектов, инициализируемых данными с ФС(порядка 14 Гб), использовал этот же принцип. доволен как слон Улыбающийся
при том, этот способ, легко позволяет распаралелить(кластеризовать) алгоритм, для повышения производительности.
« Последнее редактирование: Апрель 10, 2010, 09:48 от niXman » Записан
Страниц: 1 [2] 3 4   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.054 секунд. Запросов: 23.