Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Резервирование памяти  (Прочитано 8000 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Конская сбруя
Интересующийся

ru
Offline Offline

« : 25-04-2011 19:36 » 

Хочу для программы занять достаточно большой объём памяти:
unsigned short data_table[3][5000000];
Это получается грубо 3 х 5 Мбайт = 15 Мбайт
В процессе выполнения возникает ошибка доступа:
Unhandled exception in мой_экзе_файл: адрес_памяти: Access Violation
Существуют какие-то ограничения на объём резервируемой памяти для программы?
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #1 : 25-04-2011 20:07 » 

Конская сбруя, Во первых ты резервируеш в стеке. Поэтому тебя еше по идее говоря на стадии компиляции должно было обругнуть. Во вторых, а смысл резервирования памяти? В современных ОС у тебя никто память не отбирает. Каждый процесс работает в своем виртуальном мирке.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 26-04-2011 03:35 » 

unsigned short data_table[3][5000000];
Это получается грубо 3 х 5 Мбайт = 15 Мбайт

Спорю, что тут еще "х 2". Итого - 30 МБ.
Еще точнее - 28.6 МБ. Ведь память меряют не десятичным аршином, а двоичным!

Как уже сказано, большие блоки в стеке не создают, а тем более для резерва - динамически освободить ты его не сможешь. См. new/delete. И нафига эта морока с двумерностью и short?

Код: (C++)
void *ptrReservedMemory;

ptrReservedMemory = new char[30 * 1024 * 1024];

delete[] ptrReservedMemory;


Кстати, Вить, например в Perl есть механизм резервирования памяти — $^M.
« Последнее редактирование: 26-04-2011 03:39 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Dr.Yevhenius
Опытный

ua
Offline Offline
Пол: Мужской

« Ответ #3 : 26-04-2011 06:39 » 

... 28.6 МБ
28.6 МиБ, но 30 МБ.
Записан
Конская сбруя
Интересующийся

ru
Offline Offline

« Ответ #4 : 26-04-2011 06:43 » 

На стадии компиляции ругается, если поместить массив в какую-нибудь функцию. Если массив сделать глобальным, то ругаться перестаёт.
Если я правильно понял, то для больших объёмов данных создавать массивы не рекомендуется по причине трудностей с освобождением этой памяти. А нужно резервировать память динамически функциями calloc, malloc (на простом Си). Правильно?
Записан
Dr.Yevhenius
Опытный

ua
Offline Offline
Пол: Мужской

« Ответ #5 : 26-04-2011 06:47 » 

Конская сбруя, для больших объемов памяти (как в даном случае) используй виртуальную память, а не стек.
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 26-04-2011 09:01 » 

Глобальные переменные вообще статические. Освободить их память нельзя. А если они еще будут инициализированные константами, то будут добавляться к размеру бинарника.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #7 : 26-04-2011 09:13 » 

Dr.Y, не вирутальную память, а кучу - это перпендикулярные понятия

Конская сбруя,
1. зачем ты её резервируешь? какие цели приследуешь? как будешь её потом использовать?
2. new/delete в простейшем случае тебе подойдут
но имхо всё это может быть не правильно, лучше ответь на первый вопрос


Добавлено через 22 секунды:
и что за компилятор/среда разработки
« Последнее редактирование: 26-04-2011 09:14 от LogRus » Записан

Странно всё это....
Конская сбруя
Интересующийся

ru
Offline Offline

« Ответ #8 : 26-04-2011 15:08 » 

Работаю в Visual C++ 6.0
Такой объём памяти нужен для хранения байтов файла.
Разбиваю файл на 4 части (по типу данных) и кодирую каждую часть по-отдельности. На другой стороне обратная задача: принимаю  каждую часть по порядку, декодирую. Т.к. с принимающей стороны не собрать файл пока не придут все части, полученные нужно где-то хранить. Файлы порядка 100 МБ, отсюда и потребности.
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #9 : 26-04-2011 17:58 » 

Ага. Немного прояснилось: не резервирование памяти в его аварийном понятии (типа, чтобы другим не достался), а просто создание буфера. Я всегда говорил, что терминология важна!

Хранить на диске разве нельзя? Самый простой и гуманный способ. Временные файлы и все такое.
Если важна скорость работы, то посмотри memory mapping.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #10 : 27-04-2011 18:17 » 

а почему нельзя кодировать и сразу писать? зачем тут вообще много памяти?
Записан

Странно всё это....
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines