4

C mexでコンパイルされたファイルのメモリが不足しています(具体的には、を呼び出すとmxMallocreturnが返されることがありますNULL)。簡単な計算から、ファイルmxMallocには合計で約500 MBのメモリ(おそらく1 GB)が必要であると推定され、Matlabをほぼ排他的に実行する16GBのメモリを備えた64ビットLinuxマシンでファイルを実行します。それでも、かなり頻繁にmxMalloc戻ります。NULL

これが発生する理由はいくつかあると思いますが(メモリの断片化など)、いずれにせよ、16GBのメモリマシンに500MBを要求することはそれほど多くないようです。

Matlabのヒープからメモリを要求するための呼び出しは、mxMalloc100%確実ではないと思います(mxMalloc要求は、OSによって直接ではなく、結局Matlabによって処理されます)。では、mexファイルの「ヒープ」サイズを増やす方法はありますか?

ありがとう

4

1 に答える 1

2

使用することはできますがmalloc(ではなくmxMalloc)、メモリは手動で管理する必要があります(たとえば、呼び出す必要freeがあります。これはオプションでmxFreeはありません)。また、c++とboostの共有/スコープポインターを使用してコンパイルを試すこともできます。署名mexFunctionを前に付ける必要がありextern "C"ます。

メモリが不足している理由の1つは、配列が長すぎることです。mxArray連続したデータである必要があります。したがってmxMalloc、それらを実行すると、mxFreeメモリスペースが断片化する可能性があります。std :: vectorも連続している必要がありますが、std::listは連続している必要はありません。

元のSTLのropeクラスのようなものも良い実装になる可能性があります。

于 2011-01-22T01:35:54.690 に答える