3

プログラムの RAM の最大量を変更するにはどうすればよいですか? 常にメモリが不足しています (システムの最大ではなく、最大の ulimit)。グローバル メモリ制限を変更したくありません。vlimit() 関数が機能する可能性があることを確認しましたが、その使用方法が正確にはわかりません。

編集: Linux 2.6.38-11-generic を使用しています。これはメモリ リークではありません。文字通り、特定のクラスに 100k を割り当てる必要があります。

4

4 に答える 4

3

スタックにオブジェクトを割り当て、実際にスタックの制限に達していますか?

たとえば、次のように記述しますか。

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)

そして、あなたは考慮したいかもしれません:

スタックサイズについていつ心配しますか?

于 2011-11-03T16:06:18.563 に答える
2

これらの制限がシステム管理者によって課されている場合は、いいえ - あなたは立ち往生しています。あなたが自分自身をしているならulimit、確かに - ソフトとハードの制限を上げるだけです.

コメントで Chris が指摘したように、特権プロセスを使用している場合はsetrlimit、処理中にハード リミットを引き上げることができます。ただし、 の下にいる場合ulimit、特権プロセスである可能性は低いと推測されます。

于 2011-11-03T15:40:08.977 に答える
2

RAM制限に達している理由を理解していますか? メモリ リークが発生していないことを確認していますか(メモリ リークが発生している場合、アプリケーションを長時間実行すると、ますます多くの RAM が必要になります)。

Linux マシンを想定すると、valgrindを使用してメモリ リークを探してデバッグすることができます。また、Boehm の保守的なガベージ コレクタを使用して多くの場合それらを回避することもできます。

于 2011-11-03T15:44:57.520 に答える
1

権限がある場合は、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
  } 
} 
于 2011-11-03T15:57:25.180 に答える