|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
10.11.2013, 02:45 | #1 | |
Регистрация: 10.11.2013
Сообщений: 4
|
Выделение памяти для больших массивов
Здравствуйте!
Помогите, пожалуйста, с решением такого вопроса... Мне нужно выделить память под матрицу целых чисел размера N*N, где N~500 000 000. Просто объявить int matrix[N][N]; - при больших N не годится. Также не годится Код:
Как же выделять память для таких больших матриц? 2. Также в моей программе используется массив строк: Код:
3. Затем нужно освободить память (что будет, если не сделать это?). Если я не ошибаюсь, для матрицы N*N обычно это делается так? Код:
Код:
Цитата:
Последний раз редактировалось Stilet; 10.11.2013 в 11:12. |
|
10.11.2013, 02:51 | #2 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
1)у вас банально не хватает памяти процесса для этого, там или через файл или переходить на 64 бита надо.
2)на стеке такое не выделять, ток динамически через malloc/new. 3)да так. если не освобождать, то рано или поздно память кончится. Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
10.11.2013, 03:02 | #3 |
Регистрация: 10.11.2013
Сообщений: 4
|
1. Извините, я не совсем поняла Вас. На 64-битной машине возникают точно такие же проблемы, если выделять память также, как обычно:
int **matrix; matrix=(int **)malloc(sizeof(int)*N); for (i=0;i<N;i++) matrix[i]=(int *)malloc(sizeof(int)*N); 2. Подскажите, пожалуйста, как именно. Пыталась по-разному - никак не получается... 3. Правильно ли я освобождаю память для 2-мерного массива? В случае, если это - массив строк, освобождение памяти также происходит в два этапа? Спасибо. |
10.11.2013, 15:12 | #4 |
Старожил
Регистрация: 19.08.2009
Сообщений: 2,119
|
Пепел Феникса
или переходить на 64 бита надо. для этого ей нужно будет еще подзакупить 1.8млн. терабайт памяти :D
А вы почему со мной не соглашаетесь, у вас что, импотенция? (c) ACE Valery
|
10.11.2013, 15:47 | #5 |
C/C++, Asm
Участник клуба
Регистрация: 02.03.2010
Сообщений: 1,323
|
подзакупить 1.8млн. терабайт
ха-ха. это при том, что сегодня в x64 можно адресовать максимум 8 терабайт. по теме, большие матрицы сначала рабиваются на блоки (матрицы, которые влазят в зарезервированный буффер), а потом работа с матрицей поисходит поблочно. Последний раз редактировалось f.hump; 10.11.2013 в 15:59. |
11.11.2013, 11:54 | #6 |
Форумчанин
Регистрация: 11.01.2013
Сообщений: 149
|
Просто комментарий при ваших запросах выделить двумерный массив по 500 000 000 строк и столбцов у вас получается 25*10^16 байт и то это без учета накладных расходов на систему. По этому правильно сказана было разбивать на блоки и промежуточные результаты хранить например на винчестере, хотя винт понадобится не маленький и не один.
Может это и чушь, но это моя чушь и я ее никому не отдам.
|
11.11.2013, 13:49 | #7 |
Старожил
Регистрация: 20.04.2008
Сообщений: 5,528
|
вероятно идет речь о разреженной матрице. (много-много нулей, и мало ~5 000 000 ненулевых).
учитывая "наличие" массива строк того же размера N, можно предположить что речь идет о какой-то "сложной" обработке данного набора строк, причем в формулировке задачи звучит слово матрица (смежности?) . Будет лучше озвучить исходную задачу, возможно есть алгоритм (или реализация) где никаких матриц (таких размеров) и не потребуется.
программа — запись алгоритма на языке понятном транслятору
|
12.11.2013, 16:10 | #8 |
Регистрация: 10.11.2013
Сообщений: 4
|
Извините, оказалось, что матрица нужна гораздо меньшего размера. Поэтому переформулирую вопрос - как выделить память для 2-мерного массива, если неизвестно, сколько в нем будет элементов (но будет много)?
Или как, все-таки, выделить память для 2-мерного массива N*N, где N~100 000? Я что-то припоминаю про указатели far, huge... Хм, возможно, в матрице будет много нулей, но не настолько (по крайней мере, в каждой строчке и каждом столбце как минимум один ненулевой элемент)... |
12.11.2013, 18:31 | #9 | |
Санитар
Старожил
Регистрация: 04.10.2008
Сообщений: 2,577
|
Цитата:
Используй связные списки, тогда память сможешь выделять по мере необходимости. |
|
12.11.2013, 22:07 | #10 |
Форумчанин
Регистрация: 03.01.2013
Сообщений: 388
|
Вот-вот, согласен с rrrFer, лучше использовать динамические структуры данных. Выделите или освободите память, когда необходимо, в любой момент времени.
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Выделение памяти для объектов | Joose | Помощь студентам | 3 | 09.10.2013 11:24 |
Выделение памяти для нужд C++ библиотеки | 220Volt | Общие вопросы C/C++ | 25 | 12.01.2013 21:18 |
Ограничение/выделение памяти для приложений(программ) | gekap404 | Win Api | 1 | 13.03.2012 14:30 |
Выделение памяти для строк | virtuhay266 | Общие вопросы C/C++ | 4 | 05.12.2011 23:52 |
Выделение памяти в функции для переданных параметров | LinuxUser | Общие вопросы C/C++ | 1 | 12.11.2007 19:21 |