2

Visual C++ 2010 を使用してアプリケーションで int[400000000] (400 millions) 配列を作成しようとしていますが、オーバーフロー エラーが発生します 同じコードが Linux で g++ で実行されます。大きなマトリックスを扱っているので、これが必要です。前もって感謝します。

4

6 に答える 6

14

32 ビット アプリケーションを使用している場合、デフォルトでは 2GB のユーザー アドレス空間しかありません。4 億の整数は約 1.5GB です。これほど多くの連続したアドレス空間がない可能性が非常に高いです。各プロセスに 3GB のユーザー アドレス空間を割り当てるように 32 ビット ウィンドウを強制することは可能ですが、これは状況の一時的なギャップに過ぎない可能性があります。

64 ビット アーキテクチャに移行できる場合、これは問題になりません。それ以外の場合は、連続したストレージの単一ブロックを必要としない方法で行列データを格納する方法を見つける必要があります。たとえば、チャンクで格納するなどです。

于 2010-09-11T13:49:39.237 に答える
3

必要なのは分割統治アルゴリズムだと思います。メモリ空間ではありません。

于 2010-09-11T14:02:42.583 に答える
1

あなたの場合、STXXLを使用する方が良いかどうかはわかりません。

于 2010-09-11T13:48:14.307 に答える
1

おそらく、スパース行列はアプリケーションで役に立ちます。この概念は、非常に多くのアプリケーションに当てはまる、0 のエントリが多数ある大きな行列を扱う場合に使用されます。

ちなみに、このような膨大な量のデータをヒープに格納しても、何も得られません。CPU キャッシュがおそらく 12 MB あることを考慮してください! 少なくとも、インテリジェントな動的メモリ割り当てメカニズムを使用してください。

于 2010-09-11T14:17:25.943 に答える
0

非常に簡単な解決策を見つけましたが、それが賢明かどうかわかりません

int tab[400000000]={0};//global array

int main(array<System::String ^> ^args)
{
std::cout<<tab[399999999]<<std::endl;//ok

/*
int* tab=new int[400000000];//doesn't work
...
delete[] tab;
*/
    return 0;
}
于 2010-09-14T13:00:00.153 に答える
0

配列全体を本当に割り当てる必要がありますか? 本当に配列全体を使用しますか? 0 がたくさんある配列ですか?その場合、Linux の方がうまく機能するという事実を説明できます。

その場合、スパース配列を使用する方が適切な場合があります。既存のスパース配列の実装を使用すると、メモリ フットプリントが削減され、より高速な計算が可能になる可能性があります。

于 2010-09-11T14:02:18.903 に答える