Максимальное кол-во элементов в массиве double *m=new double[X]
double *m = new double[X] у меня создаётся массив размером 500 меговX при этом чему равен?
X = 85 392 846 уже не создаёт....
Можно что-либо сделать, чтобы создать массив на 2 Гб и т.д.?Попробуй std::vector
своп(pagefile) настроен или отключен?
Можно что-либо сделать, чтобы создать массив на 2 Гб и т.д.?возможно, надо больше памяти
а в чем глобально задача? может, стоит попробовать memory mapped file?
Можно что-либо сделать, чтобы создать массив на 2 Гб и т.д.?То, что не получается создать массив размером до 2Гб - это что-то не так настроено на данной машине.
Если хочется массив больше 2Гб, то тогда программу надо собирать как 64-битную.
Попробуй std::vectorРаботает, 200000000 элементов, 1.5 GB
Upd. Хотя new тоже столько выделяет =)
deque попробуй
своп(pagefile) настроен или отключен?Если про файл подкачки, то вроде в Винде всё работает...
Про настройки VC не в курсе..
почему при создании массива строчкой double *m = new double[X] у меня создаётся массив размером 500 мегов, а уже 800 мегов не создаётся. Ругается на команду NEW.предположу, что все дело в фрагментации памяти, ведь массивы занимают непрерывное пространство
Оперативной памяти 4 Гб.
Можно что-либо сделать, чтобы создать массив на 2 Гб и т.д.?скомпилировать прогу как x64
включить своп файл и задать ему хороший размер
вставить еще планки памяти
не создавать массивы размером 2 Гб
предположу, что все дело в фрагментации памяти, ведь массивы занимают непрерывное пространствоИ давно уже виртуальную память отменили?
если очень хочется x86 то разбей на куски по 2^20 тогда фрагментация кучи будет не так мешать
если очень хочется x86 то разбей на куски по 2^20 тогда фрагментация кучи будет не так мешатьДа, кстати. У автора на куче много чего аллоцируется или только этот массив можно считать?
Может быть аллокатор поменять тогда? Есть же вроде какие-то альтернативные.
Может быть аллокатор поменять тогда? Есть же вроде какие-то альтернативные.это ж не линукс, тут LD_PRELOAD нет, и версий рантайм-библиотек куча, поэтому всё сложнее и черезжопнее:
1) есть микрософтовский Low-fragmentation heap - я не пробовал, вероятно самое лёгкое и правильное решение;
2) есть google tcmalloc - подключить легко, но тут он совсем не в тему;
3) есть jemalloc - мозилловцы его успешно под виндой используют
- с VS2008 (как у автора) его вообще почти нереально прикрутить (там рантайм-библиотеки перекомпилируют, в общем ад)
- с VS2010 спасибо мозилле наконец-то можно более-менее быстро подключить, мы его успешно используем. Но не без костылей: перегружены только C-ные malloc/free/realloc/strdup, а new/delete приходится самостоятельно перегружать. Ну и во все STL-ные контейнеры подсовывать свой аллокатор, использующий malloc/free.
для аллокации одного куска размером в гагабайт аллокатор не нужен, нужен один сисколл
2, а просто пустая прога у тебя выделяет 800 Мб, просто int main() { return !malloc(800*1024*1024); } ?
для аллокации одного куска размером в гагабайт аллокатор не нужен, нужен один сисколлдля однократной аллокации - не нужен.
а если это нужно хоть изредка повторять, то уже придётся.
может там какая специфическая прога, которая по фиксированному адресу что-то мапиткакое отношение это имеет к (условно) моей проге, которая живет в своем виртуальном адресном пространстве при наличии необходимого количества свободных страниц?
Попробуй std::vectorТогда уж std::deque, там не один кусок памяти.
я имею в виду эту самую прогу, в которой делается new double[X]
для однократной аллокации - не нужен. а если это нужно хоть изредка повторять, то уже придётся.спасибо, кэп
Оставить комментарий
ivirkrip
Доброго времени суток!После прочтения всего что можно, остался вопрос.
почему при создании массива строчкой double *m = new double[X] у меня создаётся массив размером 500 мегов, а уже 800 мегов не создаётся. Ругается на команду NEW.
Оперативной памяти 4 Гб.
Система Win 7 64.
Пробовал в CodeBlocks и VS2008.
Можно что-либо сделать, чтобы создать массив на 2 Гб и т.д.?