Я работаю над очень большими наборами данных. Я пытаюсь выделить 16 ГБ в одном массивевыделение 16 ГБ в одном массиве, malloc терпит неудачу
по какой-то причине я не знаю, если я попытаюсь получить доступ к позиции (скажем) «600 миллионов», я понимаю, что эта позиция недоступна, и я получаю ошибка ошибки сегментации во время выполнения.
Кто-нибудь знает, почему это происходит?
моя архитектура 64 бит, поэтому должно быть возможно адресовать 16 миллиардов адресов, или, по крайней мере, это то, что я думаю.
мой вызов:
int* array = (int*) malloc(sizeof(int)* 1000000000 * 4);
спасибо всем!
@ ScottChamberlain, @Sanhdrir: он терпит неудачу, потому что он не возвращает указатель NULL. Как вы могли заметить, этот массив представляет собой матрицу. прежде чем распределять его таким образом, я попытался выделить его указателем на указатели. это потребовало большего пространства в памяти (8 миллиардов байт больше), чтобы сохранить адрес каждого указателя. Таким образом, я убил свою программу, а теперь нет, но когда я пытаюсь получить доступ к некоторым адресам, я получаю ошибку сегментации.
Редактировать если я выделил 10 блоков из 160 миллионов (или даже больше), я не получаю никаких ошибок и выделена память. проблема заключается в распределении одного большого блока. теперь мой вопрос: есть ли способ преодолеть этот предел?
edit2 @Sanhadrin ваша гипотеза все правильно, за исключением того факта, что я использую gcc. Я сообщаю здесь содержимое/ргос/MemInfo/файл MemTotal: 198049828 kB MemFree: 113419800 kB Buffers: 153064 kB Cached: 5689680 kB SwapCached: 124780 kB Active: 73880720 kB Inactive: 8998084 kB Active(anon): 70843644 kB Inactive(anon): 6192548 kB Active(file): 3037076 kB Inactive(file): 2805536 kB Unevictable: 0 kB Mlocked: 0 kB SwapTotal: 201273340 kB SwapFree: 164734524 kB Dirty: 0 kB Writeback: 0 kB AnonPages: 76915376 kB Mapped: 16376 kB Shmem: 72 kB Slab: 190352 kB SReclaimable: 124660 kB SUnreclaim: 65692 kB KernelStack: 3432 kB PageTables: 259828 kB NFS_Unstable: 0 kB Bounce: 0 kB WritebackTmp: 0 kB CommitLimit: 300298252 kB Committed_AS: 160461824 kB VmallocTotal: 34359738367 kB VmallocUsed: 733424 kB VmallocChunk: 34258351392 kB HardwareCorrupted: 0 kB AnonHugePages: 0 kB HugePages_Total: 0 HugePages_Free: 0 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB DirectMap4k: 195520 kB DirectMap2M: 37507072 kB DirectMap1G: 163577856 kB
, язык программирования c/C++ или другие? – SMA
какой размер стека (ulimit -s)? – SMA
Но ваше приложение само по себе 64-битное? В зависимости от платформы, компилятора и параметров вы можете создать 32-разрядный исполняемый файл. Кроме того, на самом деле у вас есть 16 ГБ свободной адресной памяти? Вы сказали, что «malloc() терпит неудачу». Вы действительно проверяете, является ли результат malloc NULL и проверяет errno, чтобы увидеть причину сбоя? Или вы ожидали, что он рухнет? –