Kак построить практически бесконечно большой массив? Я пытался строить с: void *p=NULL; p=VirtualAlloc(NULL,N*sizeof(double),MEM_RESERVE,PAGE_READWRITE); or double *p; p=(double *) malloc(N*sizeof(double)); Когда я делаю место для N = 2^25, он делает пространство, но когда я пробую 2^26 дает NULL. так что не выделяет 512 MB памяти, мой компьютер имеет 2 GB RAM. у кого-нибудь есть идеи? Я использую gear c++ builder 2007, также Borland developer studio 2006.
Quick_Shifter Для VirtualAlloc() не имеет принципиального значения сколько памяти имеет твой компьютер. Она выделяет память из виртуального адресного пространства, размер которого для 32-х битных процессов — 4 Гб. Из них старшие 2 Гб являются "системными" и пользователь там свои массивы данных размещать не может. VirtualAlloc() выеляет непрерывную облатсь памяти, и именно в этом причина ошибки. Нету у твоей программы такого кол-ва _непрерывной_ свободной памяти.
Quick_Shifter Есть возможность расширить юзермодное пространство до 3 гб, соответствующим параметром в BOOT.INI (/3GB). Посмотреть сколько доступно можно вызвав GlobalMemoryStatus(). Другой, более технологичный вариант - использовать AWE так - VirtualAlloc() (для адресного окна) -> AllocateUserPhysicalPages() -> MapUserPhysicalPages() -> FreeUserPhysicalPages() -> VirtualFree().
Ну да. Если я выеляю другой массив, все в порядке. Но, как сказал flankerx, VirtualAlloc выеляет непрерывную облатсь памяти. так как ее выелят? Используя 64 разрядную архитектуру юзермодное пространство будет 4GB. Извините, мог бы EvilPhreak сделать пример? Я не понимаю, как сделать один большой массив с этой техникой. Спасибо за ваши ответы.
Quick_Shifter Если интересует как решить конкретно эту пробему конкретно в этой программе, то советую запустить её и посмотреть какие модули и по каким адресам в память загружены. Возможно, если ты изменишь базу своего .exe в область значений повыше, то 512Мб выделятся... А вообще я согласен с Noble Ghost. Задача наверняка имеет решение, не требующее таких объемов памяти
Мне необходимо иметь в памяти большой 3D массив, и сделать быстрое преобразование Фурье на нем. Я использую WFFT компонент, и он нуждается что массив написан в одном ряду. Было бы хорошо иметь массив 1024x1024x1024 double типа элементов, так что будет 8 ГБ памяти. (чем больше, тем лучше).
Quick_Shifter В 64 bit 4Гб? Откуда ты такое взял? Оно для того и задумывалось, чтобы обойти ограничение по памяти в 4Гб, так как в 32 такая жопа. Ты хочешь сказать, что все усилия на смарку? LOL. WAE, PAE отстой, обнови себе комп, и поставь 64 бит операционку. Ну а если не можешь, то меняй алгос, иначе не думай. PAE - тебе проблему не решит, а даст один геморой. WAE - был разработан, именно для черезжопного доступа к дополнительной физической памяти. Виртуальной всё равно 4(2), и типо мы можем отображать страницы виртуальной на доп. физическую. Не думаю что это тебе как-то поможет.
Quick_Shifter Пример есть, но на дельфе: Код (Text): procedure hooy; const MEM_PHYSICAL = $400000; AllocSize = 2000 * 1024 * 1024; // 2 Ggb var pMemory: Pointer; lpSystemInfo: TSystemInfo; dwPages: ULONG_PTR; lpPagesArray: array of ULONG_PTR; begin pMemory := VirtualAlloc(nil, AllocSize, MEM_RESERVE or MEM_PHYSICAL, PAGE_READWRITE); GetSystemInfo(lpSystemInfo); dwPages := (AllocSize + lpSystemInfo.dwPageSize - 1) div lpSystemInfo.dwPageSize; SetLength(lpPagesArray, dwPages); if not AllocateUserPhysicalPages(GetCurrentProcess,dwPages,@lpPagesArray[0]) then RaiseLastOSError; MapUserPhysicalPages(pMemory, dwPages, @lpPagesArray[0]); // тут юзаем промапленные 2 Ggb // ... FreeUserPhysicalPages(GetCurrentProcess,dwPages,@lpPagesArray[0]); VirtualFree(pMemory, 0, MEM_RELEASE); end; На надо учитывать, что необходимая физическая память на машине все равно должна присутствовать.
А зачем использовать именно массив? Есть много оптимизированных классов контейнеров в STL . К примеру вектор, работающий с виртуальной памятью... Я не проверял конечно на очень больших размерах , но он меня ещ никогда не подводил
Kira Вектор точно так же выделяет непрерывным блоком Quick_Shifter А почему бы не разбить массив на несколько сравнительно небольших блоков, например, по 32 мб? Ну т.е. сделать массив указателей на эти небольшие массивы.
Quick_Shifter Аффтор - аццкий сотона. Название темы убило))) По-моему пора расширить множество вещественных чисел двумя элементами - "почти плюс бесконечность" и "почти минус бесконечность" )))