C ++ Изменить максимальный предел ОЗУ

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

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


person Precursor    schedule 03.11.2011    source источник
comment
вам нужно точно указать, на какой лимит вы находитесь, прежде чем мы сможем начать гадать, как поднять лимит   -  person sehe    schedule 03.11.2011
comment
Почему 100 000 объектов приводят к нехватке памяти? Насколько велик каждый объект? Возможно, вы работаете с 32-битным процессом, и его адресное пространство, а не память, является пределом?   -  person David Heffernan    schedule 03.11.2011
comment
@Precursor: Сколько памяти использует программа, когда она заканчивается? Сколько у вас оперативной памяти / свопа? Программа 32 или 64 битная?   -  person Mooing Duck    schedule 03.11.2011
comment
100к объектов по 10кб каждый - это всего лишь 1 гиг. Какой у вас установлен лимит? Сколько у вас оперативной памяти? и насколько велики эти объекты?   -  person jkerian    schedule 03.11.2011


Ответы (4)


Вы размещаете объекты в стеке и действительно достигли предела стека?

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

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 ++? (по сравнению с 2008 годом)

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

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

person Sebastian    schedule 03.11.2011

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

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

person Basile Starynkevitch    schedule 03.11.2011
comment
Это не утечка памяти. Я должен выделить около 100 000 экземпляров класса, отсюда и нехватка памяти. - person Precursor; 03.11.2011
comment
Тогда решение состоит в том, чтобы либо купить еще ОЗУ (что сегодня дешево), либо уменьшить количество экземпляров, либо уменьшить размер каждого экземпляра. - person Basile Starynkevitch; 03.11.2011

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

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

person Adam Wright    schedule 03.11.2011
comment
Что ж, я системный администратор. Но дело в том, что я действительно не хочу использовать команду ulimit в Linux, чтобы изменить ее глобально. Есть ли способ сделать это из кода? - person Precursor; 03.11.2011
comment
Вы можете использовать команду ulimit только внутри одной оболочки, то есть внутри одного терминала. - person Basile Starynkevitch; 03.11.2011
comment
Вы можете запускать через оболочку, которая не ниже лимита. Но нет API пользовательского пространства, чтобы обойти это (было бы немного бесполезно, если бы какое-либо приложение, не желающее быть ограниченным, могло просто отказаться). - person Adam Wright; 03.11.2011
comment
@Adam: есть пользовательский API - setrlimit(2). Команда ulimit - это просто тривиальная оболочка для setrlimit. Конечно, вы можете получить ошибки EPERM, если у вас нет разрешения. - person Chris Dodd; 03.11.2011
comment
@ChrisDodd Ах, моя ошибка. Хотя моя основная мысль остается неизменной - непривилегированные процессы не могут изменить свое жесткое ограничение вверх. - person Adam Wright; 03.11.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
  } 
} 
person Paul Rubel    schedule 03.11.2011