メモリ使用量を制限するには、Ex post factoとpreemptiveの2つの方法があります。つまり、プログラムが大きくなりすぎた後にプログラムを強制終了するか、そもそもプログラムが大きくなりすぎないようにプログラムすることができます。
事後的なアプローチを主張する場合は、次のBashスクリプトを使用できます。このスクリプトは、最初にプロセスID pidのプロセスが使用しているメモリの量(「常駐セットサイズ」で定義)を見つけ、grepを使用してすべての非数値データをフィルターで除外し、その量を変数nとして保存します。次に、スクリプトは、nが指定したxより大きいかどうかを確認します。そうである場合、プロセスID pidのプロセスが強制終了されます。
ご注意ください:
<pid>
プログラムのプロセスIDに置き換える必要があります。
<x>
プログラムで超過させたくないrss = "常駐セットサイズ"(つまり、実メモリサイズ)に置き換える必要があります。
n=$(ps -<pid> -o rss | grep '[0-9]')
if [ $n -gt <x> ]; then kill -9 <pid>; fi
これをy秒ごとに実行する場合は、ループで閉じて、繰り返しごとにy秒待機するように指示します。を使用して同様のコマンドを書くこともできtop
ます。あなたの出発点はでしょうtop -l 1|grep "<pid>"|awk '{print $10}'
。
@kenorbの回答が私のスクリプトの助けになりました
私はそれが質問に答えると信じていますが、長期的には、手動のメモリ割り当てを使用してプリエンプティブなアプローチをとる方がプログラミング設計が優れていると思います。
まず、メモリ使用量が本当に問題なのか、ですって。Go ドキュメントには次のように記載されています。
Goメモリアロケーターは、仮想メモリの大きな領域を割り当ての領域として予約します。この仮想メモリは、特定のGoプロセスに対してローカルです。予約によってメモリの他のプロセスが奪われることはありません。
それでも問題があると思われる場合は、Cプログラミング言語で行われているように、メモリを手動で管理することをお勧めします。goはCで書かれているので、Cのメモリ管理/割り当てにアクセスする方法はあるのではないかと思いましたが、実際にあります。このgithubリポジトリを参照してください。
システムの標準Cアロケーターを介して手動でメモリ管理を行うことができます。これは、malloc、callocの上部にある薄いラッパーで、からは無料です。システムのこれらの関数の詳細については、man mallocを参照してください。このライブラリはcgoを使用します。
使用例は次のとおりです。
なぜこれが欲しいのですか?
プログラムがメモリ不足を引き起こしている場合、またはシステムのメモリが不足している場合は、メモリの割り当てと割り当て解除を手動で制御すると役立ちます。Goは割り当ての制御に役立ちますが、不要なデータの割り当てを明示的に解除することはできません。
これはより良い長期的な解決策のようです。
C(メモリ管理を含む)について詳しく知りたい場合
は、Cプログラミング言語が標準のリファレンスです。