C ++ Изменить максимальный лимит ОЗУ - PullRequest
3 голосов
/ 03 ноября 2011

Как изменить максимальный объем оперативной памяти для программы?У меня постоянно заканчивается память (не system max, ulimit max), и я не хочу менять глобальный лимит памяти.Я оглянулся и увидел, что функция vlimit () может работать, но я точно не знаю, как ее использовать.

Редактировать: я нахожусь на linux 2.6.38-11-generic Это не утечка памятиЯ буквально должен выделить 100 КБ данного класса, никак не обойтись.

Ответы [ 4 ]

3 голосов
/ 03 ноября 2011

Вы распределяете объекты в стеке и фактически достигаете предела стека?

Вы, например, напишите что-то вроде этого:

void SomeFunction() {
    MyObject aobject[100000];
    // do something with myobject
}

Этот массив будет размещен в стеке. Лучшее решение - которое автоматизирует выделение кучи для вас - было бы написать

void SomeFunction() {
    std::vector<MyObject> veccobject(100000); // 100.000 default constructed objects
    // do something with myobject
}

Если по какой-то причине вам действительно нужен больший стек, обратитесь к документации вашего компилятора для соответствующего флага:

Как увеличить размер исполняемого стека gcc?

Можете ли вы установить размер стека вызовов в c ++? (VS2008)

И вы можете подумать:

Когда вы беспокоитесь о размере стека?

2 голосов
/ 03 ноября 2011

Понимаете ли вы , почему вы превышаете лимит ОЗУ? Вы уверены, что у вас нет утечек памяти (если у вас есть утечки, вам потребуется больше и больше оперативной памяти при более длительном запуске приложения).

Предполагая, что машина Linux, вы можете использовать valgrind для поиска и устранения утечек памяти, а также можете использовать Консервативный сборщик мусора Boehm , чтобы часто избегать их.

2 голосов
/ 03 ноября 2011

Если эти ограничения наложены на вас системным администратором, то нет - вы застряли.Если вы ulimit сами, конечно, просто поднимите мягкие и жесткие ограничения.

Как указал Крис в комментариях, если вы привилегированный процесс, вы можете использовать setrlimit, чтобы поднять ваш жесткий лимит в процессе.Однако можно предположить, что если вы находитесь под ulimit, то вряд ли вы будете привилегированным процессом.

1 голос
/ 03 ноября 2011

Если у вас есть разрешения, вы можете использовать вызов setrlimit (который заменяет vlimit), чтобы установить ограничения в начале вашей программы.Это повлияет только на эту программу и ее потомков.

#include <sys/time.h>
#include <sys/resource.h>

int main() {
  struct rlimit limit;
  limit.rlim_cur = RLIM_INFINITY;
  limit.rlim_max = RLIM_INFINITY;
  if (0 != setrlimit(RLIMIT_AS, &limit)) {
  //errro
  } 
} 
...