2011-01-21 8 views
4

私のC mexコンパイル済みファイルのメモリが不足しています(具体的には、mxMallocへの私の呼び出しは時々NULLを返します)。簡単な計算では、私のファイルはmxMallocに約500 MBのメモリ(おそらく1 GB)を求めていると推測し、Matlabをほとんど実行している64 GBのLinuxマシンでファイルを実行します。しかし、mxMallocは非常に頻繁にNULLを返します。Matlabのmexプログラムにさらにメモリを割り当てる

これは何らかの理由で(メモリの断片化など)発生する可能性がありますが、いずれの場合でも、500 MBは16 GBメモリのマシンから聞こえるほどではないようです。

mxMallocへの私の呼び出しは、Matlabのヒープからメモリを要求しますが、それについて100%は確信していません。(mxMalloc要求は結局Matlabによって処理され、OSによって直接処理されません。私のmexファイルの「ヒープ」サイズを増やす方法はありますか?

おかげ

+0

mex関数の1回の実行中に、または同じファイルの多数の実行後(ループ内)のある時点でメモリが不足していますか?私が尋ねる理由は、mexファイルを何度も実行した後で(メモリにループして)メモリの問題が発生していたことです。問題は私がmexの結果をmatlabに戻す方法にあることがわかりました。 – Marcin

+0

@Marcin、それは通常、mexファイルを数回(10回)呼び出した後に起こります。私は、私がやっている何かが間違っている場合に、私がmexの結果をMatlabに返す方法をもっと注意深く見ていきますが、私が知っておくべきことは何か(例えば、一般的な悪い対良い練習)ですか?返す前に私のデータを 'mxFree'したら、ヒープを元の断片化状態に戻してはいけませんか? –

+1

こちらをご覧ください(http://goo.gl/sYB3R)。多分、このポストはあなたに問題の可能性がある手がかりを与えるでしょう。 – Marcin

答えて

2

あなたはmallocを使用することができます(ないmxMalloc)が、メモリ(例えばあなた必見コールfree; mxFreeがあるようにそれはオプションではありません)手動で管理する必要があります。また、C++とboostのshared/scopedポインタを使ってコンパイルを試みることもできます。 mexFunctionの署名には、extern "C"が前に付いている必要があります。

メモリが不足している理由の1つは、配列が長すぎることです。 mxArrayは連続したデータでなければなりません。そのため、mxMallocを入力すると、メモリ空間が断片化する可能性があります。 std :: vectorは連続していなければなりませんが、std :: listは必ずしもそうである必要はありません。

元のSTLのropeクラスのようなものも良い実装かもしれません。

関連する問題