haartrainingで2GB以上のメモリを使用する方法
結論からいうとうまくいきませんでした。-memオプションで指定したメモリサイズの多くは1つのcvMatとして確保されるため、大きな連続したメモリ領域が必要になりますが、Windowsのヒープ管理でその領域を確保しきれないためです。知り合いのスーパーハッカーに聞いたところ、Windowsはそんな感じだという回答を得ました。
細かく確保してリンクリストで使うような設計にするといいんじゃないか…とか思いつつ、そこまではしません。
2.1GBまでは使えました。
2.1GBのメモリを使用するために変更する箇所
OpenCVはユーザ定義のメモリアロケータを指定できるように設計されていますが、ユーザ定義のメモリアロケータを呼び出す前にOpenCVで定義されているメモリサイズ上限のチェックして、それを超えている場合にエラーとしてはじいてしまいます。なぜなのかは不明なので危険な修正ですが、これをやめさせないと一度に1GB以上のメモリが確保できません。
// cxmisc.h: 81ふきん /* maximum size of dynamic memory buffer. cvAlloc reports an error if a larger block is requested. */ #define CV_MAX_ALLOC_SIZE (((size_t)1 << (sizeof(size_t)*8-2)))
size_tが4バイトで、32bitマシンでは1GB以上は一度に確保できないようになっています。
#define CV_MAX_ALLOC_SIZE ULONG_MAX
ULONG_MAXにしてしまう。これはひどい。
他、リンカのオプションを追加してコンパイル→ Windowsアプリで2GB以上のメモリを使うために必要なこと - デー。