Ошибка при выделении памяти.

Тема в разделе "Borland C++ Builder & Kylix", создана пользователем Raschet5, 4 мар 2010.

Статус темы:
Закрыта.
  1. Raschet5

    Raschet5 Гость

    Написанная программа нормально работала до тех пор пока требовалось ей не более 1,5 гига оперативы. (Обрабатываю очень большие объёмы данных и это не СУБД).
    После того как программа доходит до 1,5 гига выдаётся сообщение об ошибке :

    Project Project1.exe raised exception class std::bad_alloc message 'Exception Object Address:0x7FEEB796'. Process stopped. Use Step or Run to continue.

    В программе естественно останавливается на операторе new.
    При меньшем количестве данных программа отрабатывает нормально.

    Операционка - Vista 32 pro. Builder 6. Оперативки 3 гига.

    Где искать? В чём проблема? Подскажите кто знает.
     
  2. evgeny2k

    evgeny2k Гость

    Боюсь, что мой ответ тебя не устроит, попробуй воспользоваться VirtualAlloc().
    Быстрый пример:
    Код (Text):
    #define SIZE_16М   0x01000000
    LPVOID lpvFlashBuf = VirtualAlloc(NULL, SIZE_16М,
    MEM_RESERVE | MEM_COMMIT | MEM_TOP_DOWN ,
    PAGE_READWRITE);
    if(lpvFlashBuf )
    {
    ZeroMemory(lpvFlashBuf, SIZE_16М);

    // Пишем байтами
    LPBYTE lpbPtr = lpvFlashBuf;
    lpbPtr[0] = 1;
    lpbPtr[1] = 2;
    ...
    lpbPtr[SIZE_16М-1] = 0xFF;

    // Пишем словами
    LPBYTE lpwPtr = lpvFlashBuf;
    lpwPtr[0] = 0x0201;
    ...

    lpwPtr[SIZE_16М/2-1] = 0xFFFE;
    ...
    VirtualFree(lpvFlashBuf, 0, MEM_RELEASE);
    }
    В общем, идея понятна.
    Могут быть проблемы с выделениями больших объемов (200М и больше)за один раз, но в остальном должно работать.
     
  3. Raschet5

    Raschet5 Гость

    Спасибо. Думаю, если буду переходить на такое распределение памяти, быстродействие сильно не увеличится. Я тут кое-что изменил в программе у себя за это время и пришёл к интересным выводам.
    Мне пришлось оптимизировать работу с памятью, поскольку не знал каким образом увеличить максимум. При максимальных нагрузках хватает 1,3 гига. Но быстродействие теряется в три раза, при таких объёмах обработки (скорость = Объем обрабатываемой информации / Время обработки). Что для меня оказалось неприемлемым. Даже если мне удастся работать с VirtualAlloc(...) скорость видимо будет не слишком сильно отличаться в сравнении new-delete. Я изменил алгоритм обработки. Потребление памяти сократилось на порядок, но управление программой стало чуть сложнее. Пользователю будет сложнее. Вынужденная мера.
    Думал будут предлагать перейти на Builder 9 или скажут как изменить настройки в среде программирования, чтобы изменить максимальный объём доступной, написанной программе, памяти.
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей