Здравствуйте, Uzumaki Naruto, Вы писали:
UN>5Гб за раз — это другой вопрос... =) Может я не понял проблему человека. Хотя мне до сих пор не понятно, зачем выделять столько памяти да и еще одним блоком? Он че ядерный взрыв моделирует?
Случаи разные бывают... Я разрабатывал и отлаживал приложение в области визуализации данных, выделяя 40 Гб памяти....
Здравствуйте, Valery A. Boronin, Вы писали:
S_N>> Зачем нужны были эти все шаги? Все просто — 32-разрядное приложение не может адресовать более 4 гигабайта оперативной памяти (2 в степени 32 — даст около 4 млрд байт), а на деле — не более 3 гигабайт винда даст адресовать.
VAB>проблема же с 5 Гб как правильно в ветке уже заметили — скорее всего в неиспользовании правильного API ибо дефолтная реализация new или чем Вы там выделяли память в Вашем компиляторе, похоже, незаточена под Ваши требования.
Нет. К сожалению, спрашивающий недостаточно разбирается в правилах программирования на Си++ в целом, а не только в вопросах 64-битности. И new и malloc — все замечательно работает.
VAB>Так что я бы тоже рекомендовал почитать Рихтера и MSDN поновее (онлайн) про VirtualAlloc, причем на Висте и дальше я бы попробовал с флажком MEM_LARGE_PAGES.
Насчет Рихтера Вы абсолютно правы. Прежде чем обвинять Windows или компилятор, в неспособности выделять память, стоит почитать классиков.
Здравствуйте, Skipper_N, Вы писали:
S_N> Чтобы работало мое приложение (алгоритм) — нужно 5 ГБ памяти, меньше никак. S_N> ...... S_N> Как справиться с такой проблемой? Неужели до сих пор нельзя выделить памяти 5 ГБ одному приложению ? Я шокирован буду если так... На дворе 2008 год наступает...
А здесь можно найти ссылки на многие другие статьи по данной тематике (но уже на английском языке). http://www.viva64.com/links.php
Re[5]: Как выделить одному приложению 5 ГБ памяти?
От:
Аноним
Дата:
17.02.08 08:16
Оценка:
Здравствуйте, Analytic2007, Вы писали:
A>Случаи разные бывают... Я разрабатывал и отлаживал приложение в области визуализации данных, выделяя 40 Гб памяти....
с помощью new?
SH>>Как память выделяешь? VirtualAlloc[Ex] попробуй.
A>Не смущайте народ. A>Не стоит использовать такие тяжеловесные вещи, если хватит простого оператора new. A>Все отлично выделяется и работает: A>
A> size_t arraySize = 5368709120ULL;
A> char *array = new char [arraySize];
A> for (size_t i = 0; i != arraySize; ++i)
A> array[i] = 1;
A>
Я бы не рекомендовал выделять такие объемы по new. new сводится в HeapAlloc, который ну никак не предназначен для выделения блоков такого объема(хотя, выделить-то он его выделит скорее всего, но можно словить пенальти по производительности в самый неожиданный момент).
--
Sergey Chadov
... << RSDN@Home 1.2.0 alpha rev. 685>>
Re[2]: Как выделить одному приложению 5 ГБ памяти?
Здравствуйте, rus blood, Вы писали:
S_N>> Чтобы работало мое приложение (алгоритм) — нужно 5 ГБ памяти, меньше никак.
RB>Флаг линкера стоит? RB>/LARGEADDRESSAWARE:YES
А причем тут /LARGEADDRESSAWARE:YES ?
В 32-битной программе все равно 5 ГБ просто так не выделить. А в 64-битной никаких проблем нет.
Здравствуйте, Аноним, Вы писали:
A>>Случаи разные бывают... Я разрабатывал и отлаживал приложение в области визуализации данных, выделяя 40 Гб памяти.... А>с помощью new?
Там использовались функции malloc. Выделялось не одним блоком. Одним блоком надобности пока не было.
Хотя я и не понимаю, чем Вас смущает выделение 40GB памяти одним блоком? И чем смущает, если сделать это через new?
Re[4]: Как выделить одному приложению 5 ГБ памяти?
Здравствуйте, Sergey Chadov, Вы писали:
SH>>>Как память выделяешь? VirtualAlloc[Ex] попробуй. A>>Не смущайте народ. A>>Не стоит использовать такие тяжеловесные вещи, если хватит простого оператора new. A>>Все отлично выделяется и работает: A>>
A>> size_t arraySize = 5368709120ULL;
A>> char *array = new char [arraySize];
A>> for (size_t i = 0; i != arraySize; ++i)
A>> array[i] = 1;
A>>
SC>Я бы не рекомендовал выделять такие объемы по new. new сводится в HeapAlloc, который ну никак не предназначен для выделения блоков такого объема(хотя, выделить-то он его выделит скорее всего, но можно словить пенальти по производительности в самый неожиданный момент).
Пожалуйста, расскажите более подробно. Я не разобрался в проблеме, о которой Вы говорите.
Re[5]: Как выделить одному приложению 5 ГБ памяти?
SC>>Я бы не рекомендовал выделять такие объемы по new. new сводится в HeapAlloc, который ну никак не предназначен для выделения блоков такого объема(хотя, выделить-то он его выделит скорее всего, но можно словить пенальти по производительности в самый неожиданный момент).
A>Пожалуйста, расскажите более подробно. Я не разобрался в проблеме, о которой Вы говорите.
Проблемы как таковой нет. Просто куча предназначена(и оптимизирована) для размещения относительно небольших объектов, для чего в ней _поверх_ памяти, выделенной по VirtualAlloc навернуты некоторые структуры данных.
--
Sergey Chadov
... << RSDN@Home 1.2.0 alpha rev. 685>>
Re[7]: Как выделить одному приложению 5 ГБ памяти?
От:
Аноним
Дата:
17.02.08 19:41
Оценка:
Здравствуйте, Analytic2007, Вы писали:
A>Хотя я и не понимаю, чем Вас смущает выделение 40GB памяти одним блоком? И чем смущает, если сделать это через new?
смущает тем, что это heap
имхо heap для этого не очень хорош
Re[8]: Как выделить одному приложению 5 ГБ памяти?
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Analytic2007, Вы писали:
A>>Хотя я и не понимаю, чем Вас смущает выделение 40GB памяти одним блоком? И чем смущает, если сделать это через new? А>смущает тем, что это heap А>имхо heap для этого не очень хорош
ПОЧЕМУ ? (Желательно со ссылками на статьи/документацию)
Re[6]: Как выделить одному приложению 5 ГБ памяти?
От:
Аноним
Дата:
17.02.08 19:54
Оценка:
Здравствуйте, Sergey Chadov, Вы писали:
SC>Проблемы как таковой нет. Просто куча предназначена(и оптимизирована) для размещения относительно небольших объектов, для чего в ней _поверх_ памяти, выделенной по VirtualAlloc навернуты некоторые структуры данных.
Странно, не в стеке же выделять несколько гигабайт, ведь размер стека указывается при компиляции и он, кажется около мегабайта.
Или есть кроме стека и кучи еще что-то?
Re[6]: Как выделить одному приложению 5 ГБ памяти?
Здравствуйте, Sergey Chadov, Вы писали:
SC>>>Я бы не рекомендовал выделять такие объемы по new. new сводится в HeapAlloc, который ну никак не предназначен для выделения блоков такого объема(хотя, выделить-то он его выделит скорее всего, но можно словить пенальти по производительности в самый неожиданный момент).
A>>Пожалуйста, расскажите более подробно. Я не разобрался в проблеме, о которой Вы говорите.
SC>Проблемы как таковой нет. Просто куча предназначена(и оптимизирована) для размещения относительно небольших объектов, для чего в ней _поверх_ памяти, выделенной по VirtualAlloc навернуты некоторые структуры данных.
Ну вот по поему внутреннему ощущению для 64-битной системы 5 гигабайт совсем небольшой объект.
Можете пояснить мысль, которую Вы хотите донести, ссылкой на статью или иной документ? (Перечитать всего Рихтера просьба не предлагать Буду признателен.
Re[7]: Как выделить одному приложению 5 ГБ памяти?
Есть VirtualAlloc, который является основным механизмом выделения памяти в Windows. Куча строится поверх памяти, выделенной VirtualAlloc(ну или точнее, одной из функций, для которых VirtualAlloc является оберткой).
--
Sergey Chadov
... << RSDN@Home 1.2.0 alpha rev. 685>>
Re[7]: Как выделить одному приложению 5 ГБ памяти?
SC>>Проблемы как таковой нет. Просто куча предназначена(и оптимизирована) для размещения относительно небольших объектов, для чего в ней _поверх_ памяти, выделенной по VirtualAlloc навернуты некоторые структуры данных.
A>Ну вот по поему внутреннему ощущению для 64-битной системы 5 гигабайт совсем небольшой объект.
Для системы — может быть. Для кучи — не знаю, возможно что и многовато.
A>Можете пояснить мысль, которую Вы хотите донести, ссылкой на статью или иной документ? (Перечитать всего Рихтера просьба не предлагать Буду признателен.
Я, собственно говоря, просто исхожу из своего опыта написания распределителей памяти. "Серебяной пули" не бывает. И если куча хорошо себя ведет при распределении большого количества маленьких объектов(что вообще-то для нее желательно, пооскольку именно так ей в основном и пользуются), то часто такая куча неадекватно ведет себя с большими объектами(точнее даже со смесью больших и маленьких объектов). Насколько неадекватно ведет себя виндовая куча, да еще на 64-битной винде я сказать не могу, но просто из соображений здравого смысла(то есть пока тесты не покажут обратного) я бы поостерегся выделять такие здоровые блоки в той же куче, где живут все остальные динамические объекты. Вполне возможно, что для некоторых сценариев использования виндовая куча покажет хорошие результаты, но по-умолчанию я бы все-таки воспользовался VirtaulAlloc/
--
Sergey Chadov
... << RSDN@Home 1.2.0 alpha rev. 685>>
Re[3]: Как выделить одному приложению 5 ГБ памяти?
Здравствуйте, Analytic2007, Вы писали:
A>А причем тут /LARGEADDRESSAWARE:YES ?
Всякое бывает, может быть, у топикстартера неправильные параметры проекта.