1

Eigen の行列形式を使用して、以前に取得した多次元データを読み取ります。

Eigen::Matrix<unsigned long long, Eigen::Dynamic, 12> dummyData;

後で私のデータサイズを知った後:

dummyData.resize(PackSize, 12);

PackSizeの順序である可能性があり6e08ます。バッファサイズを計算するときの整数オーバーフローを避けるために、以前は win32unsigend long longでアドレス指定できました。(PackSize* 12*8) mod (2^32)それでも、私は次のことを思いつきますUnhandled exception at 0x75362F71 in DataRead.exe: Microsoft C++ exception: std::bad_alloc at memory location 0x004CBCF0。誰かがこの問題を処理するのを手伝ってくれませんか?

4

1 に答える 1

1

unsigned long longMatrix のスカラー型を使用する必要があるかどうかは完全にはわかりません。数学的に言えば、行列はフィールドに対して定義する必要があり、正の整数の乗法逆数 (つまり、符号なし整数を乗算する必要がある符号なし整数) を見つけようとすると、環論は簡単にはいかないことに注意する必要があります。 1 を取得するための整数)。

ただし、これは Eigen では合法であるため、これに固執します。フィールドからこれらのプロパティを必要とする行列で操作を実行したくない場合があります。

したがって、win32 (Windows API) を使用していると言っていますが、オペレーティング システムが 32 ビットか 64 ビットかは実際には違います。32 ビット Windows を実行している場合、どのプロセスも 2GB を超える仮想アドレス空間を持つことはできず、2GB/sizeof(long long) unsigned long long を超える割り当ては機能しません。現在、long long は 64 ビット = 8 バイトであるため、2GB あたりに使用できる uint64_t の最大数は 134217728 です。ここで、それらを 12 列の行に配置して、最大 11,184,810 行を残します (プロセスのメモリ内にあるのは数字だけではないという事実を無視してください)。ここで、11e6 < 6e8 であり、Eigen が使用しようとしているアロケーターのタイプがわからないという事実を説明する必要があります。実際には、必要以上に多くのアロケーターを割り当てようとする可能性があります。

ただし、最も可能性が高いのは、12 列の形式も、より適切に配置されたものにパディングされることです。Eigen のドキュメントはそれについてあまり具体的ではなく、実際の実装は Eigen ライブラリがどのようにコンパイルされたかに依存すると思うので、一般的には適切なアドバイスはできません。DontAlignEigen::Matrix テンプレートのオプションで試すことができます。

于 2015-01-09T15:34:21.590 に答える