2012-03-09 11 views
0

私は、巨大なアンマネージマトリックス構造(std::vector<std::vector<T> >)を同等の管理対象構造(cli::array<T,2>)に再割り当てするためのコードを取得しようとしています。両方の構造体を同時にメモリに保持することができないため、ファイルに書き込んで構造体を読み戻すことを選択しました。問題は、いったん元の行列を削除すると、行列の管理対象メモリを割り当てようとしているメモリが失敗するということです。マトリックスを管理対象外から管理対象に再割り当て

イメージこれは、さまざまなランタイムのヒープと関係がある可能性があります。cpp vs clrしかし、具体的な詳細を見つけることはできません。 cppランタイムがヒープスペースを保持している可能性があります。これは、clrヒープが行列を戻すのを防ぎますか?もしそうなら、clrヒープのためのスペースを確保するために、cppランタイムにヒープスペースのクリーンアップを強制することは可能ですか?

ここで、宛先マトリックスは、ジギングされた配列ではなく、二次元配列でなければなりません。これにはサイズを変更できない問題があることはわかっています。さもなければ、私は小さな塊で行列を動かすことができるかもしれません。

ありがとうございます。

+0

ギザギザの配列を使用することができないのは、かなりの人為的な制限です。それは確かにあなたのアドレス空間の断片化の問題を解決します。 64ビットオペレーティングシステムが簡単な回避策です。 –

答えて

0

あなたが同時にメモリに両方を持つことができない場合、私は配列がギガバイト以上のサイズであると思います。これを管理された矩形(非ぎざぎざ)の配列に配置したい場合、CLRは1ギガバイトの連続したメモリを見つけなければなりません...それは簡単に失敗する可能性があります。

64ビット版、または「large adress awarene」と宣言された32ビット版を実行しようとしましたか?後者は、64ビットのWindowsマシン上で実行している場合、4ギガバイトのアドレス空間を提供します。

+0

私は実際にフラグ/ largespaceawareとリンクしています。現在、64ビットに切り替えることを検討していますが、実行中のマシンのすべてが64ビットではありません。 CLRには連続的なメモリが必要ですか?私は、ベクトルが解放されたように、仮想アドレスシステムがそれを処理しますが。 – fprades

+0

二次元配列はメモリ内で(アプリケーションのアドレス空間内で)連続しています。あなたのアドレス空間は、あなたのC++コードでの割り当てによって断片化することができます。 C++コードを別のプロセスで実行することを検討してください。とにかくデータを転送するファイルを作成しています。 –

関連する問題