- ベストアンサー
2次元配列を確保したいのですが、
2次元配列を確保したいのですが、 size of array 'buf' is too large というエラーで確保できません。 mallocを使って確保しようとしましたが、コンパイルできましたが、 実行するとメモリ確保に失敗します。 大きな2次元配列を確保する方法を教えてください。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
2,000,000×2,000,000×4バイトで、約16TB(= 16,000GB)のメモリが必要になる計算です。 32ビットOSでは到底扱えませんし、64ビット版のWindowsでも現状では無理です (64ビット版Windowsの1プロセスあたりの仮想アドレス空間は8TBまで)。 計算のやり方を根本的に変えるしかありません。
補足
実行環境 Windows Vista(32ビット) メモリ 4GB MinGW gcc 配列計算するプログラムです。プログラムは、省略します。 1 普通に配列を宣言すると「size of array 'buf' is too large」と表示して、コンパイルできない。 #define SIZE 2000000 float buf1[SIZE][SIZE]; float buf2[SIZE][SIZE]; int i; int j; 省略 for(i=0;i<SIZE;i++) { for(j=0;j<SIZE;j++) { buf1[i][j] = buf1[i][j] * buf2[i][j]; } } 2 また、mallocを使う方法は、以下です。 この方法は、コンパイルできますが、実行時に「メモリを確保できませんでした。」と表示します。 #define SIZE 2000000 float **buf1; float **buf2; int i; int j; 省略 buf1 = (float**)malloc(sizeof(float*)*SIZE); for(i=0;i<SIZE;i++) { buf1[i] = (float*)malloc(sizeof(float)*SIZE); if(buf1[i] == NULL) { printf("メモリを確保できませんでした。\n"); } } buf2 = (float**)malloc(sizeof(float*)); for(i=0;i<SIZE;i++) { buf2[i] = (float*)malloc(sizeof(float)*SIZE); if(buf2[i] == NULL) { printf("メモリを確保できませんでした。\n"); } } 大きな2次元配列を確保する方法を教えてください。