0

非常に大きなサイズの配列を作成するにはどうすればよいですか?? さて、サイズ INT_MAX の配列を作成することはできません..どうすればこれを達成できますか.?

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#define SIZE 2147483647

int main() {    
   int *array;    
   unsigned int i;

   array = malloc(sizeof(int) * SIZE);    
   if(array == NULL)    {
      fprintf(stderr, "Could not allocate that much memory");
      return 1;    }

   for(i=0; i<1; i++)    {
      array[0] = 0;    
   }    

   free(array); 
}
4

4 に答える 4

5

ほぼ確実にプラットフォームの制限に達しています。32 ビットのアドレス空間しかない場合、4G で十分対応できます。実際には、アドレス空間の一部が他のものによって占有されるため、これははるかに少なくなります。

64 ビットのアドレス空間では可能かもしれませんが、そのレベルの割り当てに到達したら、実際に必要かどうかを自問する必要があります。

この問題を解決する方法は、ディスクなどのメモリ不足のストレージを使用し、必要なものだけをメモリに取り込むことです。

つまり、データ構造を (たとえば) 1M チャンクに分割し、一度に 1M ずつ処理します。

データ構造の使用パターンに応じて、これを効率的に行うために使用できるキャッシュ アルゴリズムはたくさんあります。

たとえば、真にシーケンシャルなアクセスの場合、一度に 1 つのチャンクをメモリに保持できます。真のランダム アクセスを実現するには、キャッシュ シナリオで一度に複数のチャンクをメモリ内に保持する必要がある場合があります。各メモリ内構造は、1M のデータとメモリ外ストレージ内のその場所の両方を格納するため、LRU アルゴリズムを使用できます。ダーティデータの書き戻しなど。

于 2011-01-08T06:04:16.880 に答える
1

あなたの最初の問題は、割り当て自体ではなく、一見単純な式sizeof(int) * SIZEです。その操作の結果は、4 バイトの0x1FFFFFFFC場合です。intこれを表すには 33 ビットが必要です。size_tプラットフォームに 32 ビットのタイプしかない場合、乗算の結果はラップアラウンド (size_t符号なし) になり、 が得られます0xFFFFFFFC

malloc の呼び出しで上記の 33 ビット値を使用した場合、コンパイラはおそらく、その数値は表現できないと通知したでしょう。

于 2011-01-08T09:25:46.793 に答える
0

最小 4GB サイズのアレイを作成しています。それだけの空きメモリがありますか?

于 2011-01-08T05:58:09.803 に答える
-1

これまでのところ、誰もがあなたの質問に答えようとしていますが、別のアプローチを取りたいと思います。私の経験では、割り当てようとしているタイプ/サイズの配列が実際に必要になることはまれです。多くの場合、そのような巨大な構造を作成せずに必要なことを行う方法は他にもあります (解析配列、スタック、キュー、マップ)。

この配列で何をしたいのか興味があります。. . あなたが解決しようとしている問題が何であるかを理解していれば、実際には必要ないに違いありません。

一方で、これが知的な課題である場合 (どのくらいの大きさを割り当てることができるかなど)、そのような質問に答える方法もあります。

あなたが遊びたいなら。. . あなたが実際に達成しようとしていることは何ですか?

于 2011-01-08T16:01:35.750 に答える