Максимальное кол-во элементов в массиве double *m=new double[X]

ivirkrip

Доброго времени суток!
После прочтения всего что можно, остался вопрос.
почему при создании массива строчкой double *m = new double[X] у меня создаётся массив размером 500 мегов, а уже 800 мегов не создаётся. Ругается на команду NEW.
Оперативной памяти 4 Гб.
Система Win 7 64.
Пробовал в CodeBlocks и VS2008.
Можно что-либо сделать, чтобы создать массив на 2 Гб и т.д.?

Dasar

double *m = new double[X] у меня создаётся массив размером 500 мегов
X при этом чему равен?

ivirkrip

X = 62 311 866 - создаёт.
X = 85 392 846 уже не создаёт....

Devid

Можно что-либо сделать, чтобы создать массив на 2 Гб и т.д.?
Попробуй std::vector

Dasar

своп(pagefile) настроен или отключен?

okis

Можно что-либо сделать, чтобы создать массив на 2 Гб и т.д.?
возможно, надо больше памяти
а в чем глобально задача? может, стоит попробовать memory mapped file?

Dasar

Можно что-либо сделать, чтобы создать массив на 2 Гб и т.д.?
То, что не получается создать массив размером до 2Гб - это что-то не так настроено на данной машине.
Если хочется массив больше 2Гб, то тогда программу надо собирать как 64-битную.

Devid

Попробуй std::vector
Работает, 200000000 элементов, 1.5 GB
Upd. Хотя new тоже столько выделяет =)

evgen5555

deque попробуй

ivirkrip

своп(pagefile) настроен или отключен?
Если про файл подкачки, то вроде в Винде всё работает...
Про настройки VC не в курсе..

Maurog

почему при создании массива строчкой double *m = new double[X] у меня создаётся массив размером 500 мегов, а уже 800 мегов не создаётся. Ругается на команду NEW.
Оперативной памяти 4 Гб.
предположу, что все дело в фрагментации памяти, ведь массивы занимают непрерывное пространство

Maurog

Можно что-либо сделать, чтобы создать массив на 2 Гб и т.д.?
скомпилировать прогу как x64
включить своп файл и задать ему хороший размер
вставить еще планки памяти
не создавать массивы размером 2 Гб

tokuchu

предположу, что все дело в фрагментации памяти, ведь массивы занимают непрерывное пространство
И давно уже виртуальную память отменили? :shocked:

vall

если очень хочется x86 то разбей на куски по 2^20 тогда фрагментация кучи будет не так мешать

tokuchu

если очень хочется x86 то разбей на куски по 2^20 тогда фрагментация кучи будет не так мешать
Да, кстати. У автора на куче много чего аллоцируется или только этот массив можно считать?
Может быть аллокатор поменять тогда? Есть же вроде какие-то альтернативные.

ava3443

Может быть аллокатор поменять тогда? Есть же вроде какие-то альтернативные.
это ж не линукс, тут LD_PRELOAD нет, и версий рантайм-библиотек куча, поэтому всё сложнее и черезжопнее:
1) есть микрософтовский Low-fragmentation heap - я не пробовал, вероятно самое лёгкое и правильное решение;
2) есть google tcmalloc - подключить легко, но тут он совсем не в тему;
3) есть jemalloc - мозилловцы его успешно под виндой используют
 - с VS2008 (как у автора) его вообще почти нереально прикрутить (там рантайм-библиотеки перекомпилируют, в общем ад)
 - с VS2010 спасибо мозилле наконец-то можно более-менее быстро подключить, мы его успешно используем. Но не без костылей: перегружены только C-ные malloc/free/realloc/strdup, а new/delete приходится самостоятельно перегружать. Ну и во все STL-ные контейнеры подсовывать свой аллокатор, использующий malloc/free.

vall

для аллокации одного куска размером в гагабайт аллокатор не нужен, нужен один сисколл

Serab

Там один VirtualAlloc, ему по идее может помешать только отсутствие свободного куска в виртуальном пространстве ну или вообще конец физ. памяти (с файлом подкачки вместе). Почему там такая фрагментация — хз, надо выяснять, может там какая специфическая прога, которая по фиксированному адресу что-то мапит.
2, а просто пустая прога у тебя выделяет 800 Мб, просто int main() { return !malloc(800*1024*1024); } ?

ava3443

для аллокации одного куска размером в гагабайт аллокатор не нужен, нужен один сисколл
для однократной аллокации - не нужен.
а если это нужно хоть изредка повторять, то уже придётся.

elenangel

может там какая специфическая прога, которая по фиксированному адресу что-то мапит
какое отношение это имеет к (условно) моей проге, которая живет в своем виртуальном адресном пространстве при наличии необходимого количества свободных страниц?

asvsergey

Попробуй std::vector
Тогда уж std::deque, там не один кусок памяти.

Serab

я имею в виду эту самую прогу, в которой делается new double[X]

vall

для однократной аллокации - не нужен. а если это нужно хоть изредка повторять, то уже придётся.
спасибо, кэп
Оставить комментарий
Имя или ник:
Комментарий: