Kак построить практически бесконечно большой массив?

Тема в разделе "LANGS.C", создана пользователем Quick_Shifter, 12 фев 2008.

  1. Quick_Shifter

    Quick_Shifter New Member

    Публикаций:
    0
    Регистрация:
    5 фев 2008
    Сообщения:
    5
    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.
     
  2. flankerx

    flankerx New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2004
    Сообщения:
    423
    Адрес:
    Moscow, Russia
    Quick_Shifter
    Для VirtualAlloc() не имеет принципиального значения сколько памяти имеет твой компьютер. Она выделяет память из виртуального адресного пространства, размер которого для 32-х битных процессов — 4 Гб. Из них старшие 2 Гб являются "системными" и пользователь там свои массивы данных размещать не может.
    VirtualAlloc() выеляет непрерывную облатсь памяти, и именно в этом причина ошибки. Нету у твоей программы такого кол-ва _непрерывной_ свободной памяти.
     
  3. EvilPhreak

    EvilPhreak New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    154
    Quick_Shifter
    Есть возможность расширить юзермодное пространство до 3 гб, соответствующим параметром в BOOT.INI (/3GB). Посмотреть сколько доступно можно вызвав GlobalMemoryStatus(). Другой, более технологичный вариант - использовать AWE так - VirtualAlloc() (для адресного окна) -> AllocateUserPhysicalPages() -> MapUserPhysicalPages() -> FreeUserPhysicalPages() -> VirtualFree().
     
  4. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Quick_Shifter
    Используй 64 разрядную архитектуру.
     
  5. Quick_Shifter

    Quick_Shifter New Member

    Публикаций:
    0
    Регистрация:
    5 фев 2008
    Сообщения:
    5
    Ну да. Если я выеляю другой массив, все в порядке. Но, как сказал flankerx, VirtualAlloc выеляет непрерывную облатсь памяти. так как ее выелят?

    Используя 64 разрядную архитектуру юзермодное пространство будет 4GB.

    Извините, мог бы EvilPhreak сделать пример? Я не понимаю, как сделать один большой массив с этой техникой.

    Спасибо за ваши ответы.
     
  6. Noble Ghost

    Noble Ghost New Member

    Публикаций:
    0
    Регистрация:
    28 апр 2004
    Сообщения:
    204
    Адрес:
    Russia
    Quick_Shifter
    лучше бы задачу описал, интереснее было бы.
     
  7. flankerx

    flankerx New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2004
    Сообщения:
    423
    Адрес:
    Moscow, Russia
    Quick_Shifter
    Если интересует как решить конкретно эту пробему конкретно в этой программе, то советую запустить её и посмотреть какие модули и по каким адресам в память загружены. Возможно, если ты изменишь базу своего .exe в область значений повыше, то 512Мб выделятся...

    А вообще я согласен с Noble Ghost. Задача наверняка имеет решение, не требующее таких объемов памяти :)
     
  8. Quick_Shifter

    Quick_Shifter New Member

    Публикаций:
    0
    Регистрация:
    5 фев 2008
    Сообщения:
    5
    Мне необходимо иметь в памяти большой 3D массив, и сделать быстрое преобразование Фурье на нем. Я использую WFFT компонент, и он нуждается что массив написан в одном ряду. Было бы хорошо иметь массив 1024x1024x1024 double типа элементов, так что будет 8 ГБ памяти. (чем больше, тем лучше).
     
  9. Yashin

    Yashin New Member

    Публикаций:
    0
    Регистрация:
    25 янв 2008
    Сообщения:
    19
    EvilPhreak имел ввиду почитай Рихтера.
     
  10. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Quick_Shifter
    В 64 bit 4Гб? Откуда ты такое взял? Оно для того и задумывалось, чтобы обойти ограничение по памяти в 4Гб, так как в 32 такая жопа. Ты хочешь сказать, что все усилия на смарку? LOL. WAE, PAE отстой, обнови себе комп, и поставь 64 бит операционку. Ну а если не можешь, то меняй алгос, иначе не думай. PAE - тебе проблему не решит, а даст один геморой. WAE - был разработан, именно для черезжопного доступа к дополнительной физической памяти. Виртуальной всё равно 4(2), и типо мы можем отображать страницы виртуальной на доп. физическую. Не думаю что это тебе как-то поможет.
     
  11. EvilPhreak

    EvilPhreak New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    154
    Quick_Shifter
    Пример есть, но на дельфе:

    Код (Text):
    1. procedure hooy;
    2. const
    3.   MEM_PHYSICAL = $400000;
    4.   AllocSize = 2000 * 1024 * 1024; // 2 Ggb
    5. var
    6.   pMemory: Pointer;
    7.   lpSystemInfo: TSystemInfo;
    8.   dwPages: ULONG_PTR;
    9.   lpPagesArray: array of ULONG_PTR;
    10. begin
    11.   pMemory := VirtualAlloc(nil, AllocSize,
    12.     MEM_RESERVE or MEM_PHYSICAL, PAGE_READWRITE);
    13.  
    14.   GetSystemInfo(lpSystemInfo);
    15.  
    16.   dwPages := (AllocSize + lpSystemInfo.dwPageSize - 1) div lpSystemInfo.dwPageSize;
    17.  
    18.   SetLength(lpPagesArray, dwPages);
    19.   if not AllocateUserPhysicalPages(GetCurrentProcess,dwPages,@lpPagesArray[0]) then RaiseLastOSError;
    20.  
    21.   MapUserPhysicalPages(pMemory, dwPages, @lpPagesArray[0]);
    22.  
    23.   // тут юзаем промапленные 2 Ggb
    24.  
    25.   // ...
    26.  
    27.   FreeUserPhysicalPages(GetCurrentProcess,dwPages,@lpPagesArray[0]);
    28.   VirtualFree(pMemory, 0, MEM_RELEASE);
    29. end;
    На надо учитывать, что необходимая физическая память на машине все равно должна присутствовать.
     
  12. Kira

    Kira New Member

    Публикаций:
    0
    Регистрация:
    24 янв 2008
    Сообщения:
    17
    А зачем использовать именно массив? Есть много оптимизированных классов контейнеров в STL . К примеру вектор, работающий с виртуальной памятью...
    Я не проверял конечно на очень больших размерах , но он меня ещ никогда не подводил
     
  13. maxdiver

    maxdiver Max

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    308
    Адрес:
    Саратов
    Kira
    Вектор точно так же выделяет непрерывным блоком :)

    Quick_Shifter
    А почему бы не разбить массив на несколько сравнительно небольших блоков, например, по 32 мб? Ну т.е. сделать массив указателей на эти небольшие массивы.
     
  14. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Quick_Shifter

    Аффтор - аццкий сотона. Название темы убило)))

    По-моему пора расширить множество вещественных чисел двумя элементами - "почти плюс бесконечность" и "почти минус бесконечность" )))