32ビットアプリケーションの固有マックスマトリックスサイズ
質問
だから、私はそれを見つけています 固有 10000x10000を超えるマトリックスを宣言しようとすると、パッケージがクラッシュします。このようなマトリックスを宣言する必要があります。約13000x13000要素を確実に。次のようなテストを実行しました。
for( int tortureEigen = 1 ; tortureEigen < 50000 ; tortureEigen++ )
{
printf( "Torturing Eigen with %dx%d..\n", tortureEigen, tortureEigen ) ;
Eigen::MatrixXd m( tortureEigen, tortureEigen ) ;
}
14008要素でマシン(6 GB RAM)でクラッシュします。
私はちょっとがっかりしています! EigenはMatlabやOctaveのようなものであり、ディスクなどにヒットしても、大きな配列を使用してクラッシュするべきではないと思いました。
さらに、このテストを実行してTaskmanを開いたままにしておくと、これらのマトリックスを作成しているプロセスはそれほど多くのメモリを使用しません。 Taskmanは2Kの使用状況下で報告しています。
Eigen 2.0.15安定したリリースを使用します
解決 2
ここのすべての答えは役に立ちます!
それはそうだとわかります コンパイルされたとき として 32ビット アプリ、eigenはあなたが宣言しようとするとクラッシュします 濃いmatrixxd, 、私がそうであったように、14000個以上の要素が大きい。クラッシュはで起こります _aligned_malloc
Eigen Alloc Code(Matrixxd :: Resize())で0を返します。1.5GBの連続した整列RAMを意味することは、32ビットで割り当てることができませんでした。これは理にかなっています。 。 4.0のうち1.5 GB以上が隣接するのを見つけることは、本当にありそうもないと思います!残念ながら、Eigen 3.0へのアップグレード ではない 問題を解く。
ソリューション#1
それでは、64ビットでコンパイルし、6GBマシンでプログラムが正常に実行され、密なMatrixxDの割り当てとソリューションが正常に動作します。
ソリューション#2
別のソリューションは、aを使用することです DynamicSparseMatrix<double>
. 。スパースは32ビットアプリであっても、巨大なサイズのアロックでクラッシュしませんが、解決のためのAPIサポートは別のストーリーです(APIは解決するためにMatrixxD密度の高いタイプに変換したいと思われます。これにより、同じ元の問題が残ります)。
他のヒント
Eigen開発者はこちら。あなたは私たちのサポートチャネルEg Forumで私たちのサポートチャネルでeigenの質問をする方がはるかに良いでしょう... ;-)
簡単な答え:固定または動的サイズのマトリックスを使用していますか?
固定サイズの場合は、ダイナミックサイズに切り替えます(このような巨大なサイズの場合、とにかく簡単です)
ダイナミックサイズのマトリックスでバグを取得している場合、私は驚きましたが、同時に、値10000がどこから来たのかを見ることができます。いずれにせよ、Eigen3(開発部門)にアップグレードすると、問題はなくなります。
eigen docの外:
密度とスパース:このマトリックスクラスは、スパースマトリックスやベクトルではなく、密なものを処理します。スパースマトリックスとベクトルについては、スパースモジュールを参照してください。
高密度のマトリックスとベクトルは、係数の単純な通常の配列です。すべての係数は、通常の隣接する配列に保存されます。これは、係数が非ゼロ係数のリストとして保存されているスパースマトリックスやベクトルとは異なります。
見てみましょう、10000x10000x8(double-matrix)は約1.5GBを作成します。これは、32ビットOSの下での連続ヒープブロックの最大サイズについてです。スパースマトリックスを試してください。
このような大きな密なマトリックスが本当に必要な場合、他にもいくつかの問題があります。計算は次の停電の前に終了しますか?
あなたのハードウェアの仕様を考えると、私はあなたが64ビットOSで実行されていると仮定することができます。
メモリがページファイルにページングされた場合でも、引き続きクラッシュする可能性があります。メモリが断片化されているか、ページファイルがまだ小さすぎることを意味する場合があります。その場合、ページファイルを8や12 GB程度のようなかなり大きなものにバンプアップする必要があります。