1

簡単な質問です。私は巨大な画像ファイル (8kx8k) を開く必要があるプログラムを書いていますが、c++ で画像を保持するために巨大な配列を初期化する方法について少し混乱しています。

私はこのようなことを試みています:

long long SIZE = 8092*8092;     ///8096*8096
double* array;
array = (double*) malloc(sizeof(double) * SIZE);
if (array == NULL)
{
    fprintf(stderr,"Could not allocate that much memory");
}

しかし、配列が初期化されていないことを NULL チェックでキャッチできないことがあります。

また、12 GB の RAM を搭載した x64 マシンで実行している場合でも、2 つまたは 3 つ以上のアレイを初期化できません。

代わりに、配列のセクションを操作する必要がないようにしたいと思います。どんな助けでも大歓迎です。

ありがとう。

4

9 に答える 9

4

配列サイズの問題は発生していません。8K*8K は 64M にすぎません。64M 倍精度 (sizeof==8) でも問題ありません。わずか 512 MB しか必要としません。これで、32 ビット アプリケーションは (どこで実行されていても) それらのいくつかを割り当てることができるはずです。8 ではありません。OS は通常、それ自体のためにいくらかのスペース (多くの場合 2GB をわずかに超える) を予約する必要があり、メモリが断片化されている場合は 3 でさえない場合があるためです。

「malloc failed but did not return NULL」の動作は、Linux 構成のバグであり、# echo 2 > /proc/sys/vm/overcommit_memory

于 2009-10-19T11:46:39.363 に答える
4

malloc() はメモリを初期化せず、単に予約します。たとえば、string.h から memset() を介して、明示的に初期化する必要があります。

array = (double*) malloc(SIZE * sizeof(double));
if (array) memset(array, 0, SIZE * sizeof(double));

ただし、C++では、 mallocの代わりにnewを使用する必要があります。

double* array = new double[SIZE];
if (!array) {
    cerr << "Could not allocate that much memory" << endl;
}
for (int i=0; i<SIZE; i++) array[i] = 0.0;

サイズについて: このような配列はそれぞれ 512 MB です。倍精度が必要だと確信していますか (つまり、画像のピクセル深度が 64 ビットであることを意味します)。多分フロートで十分でしょうか?これにより、メモリ フットプリントが半分になります。

于 2009-10-19T11:52:39.090 に答える
3

32 ビット オペレーティング システムを実行している場合、プロセスあたり 2 GB のアドレス空間制限に達している可能性があります。数百 MB のシステム ライブラリやその他のものと、それぞれ 512 MB の 2 つまたは 3 つのアレイを使用すると、簡単に 2GB になります。64 ビット OS が役に立ちます。

于 2009-10-19T11:39:48.910 に答える
2

アプリケーションを32ビットアプリケーション(使用している場合はVisual Studioのデフォルト)としてコンパイルしますか、それとも64ビットアプリケーションとしてコンパイルしますか?64ビットアプリとしてビルドすれば問題ありません。

mallocは割り当て(メモリを予約してポインタを返します)、callocは初期化します(そのメモリにすべてゼロを書き込みます)。

于 2009-10-19T12:00:30.340 に答える
1

C ランタイム ヒープには、そのようなサイズ (~500Mb) の連続メモリ ブロックがないようです。ファイルをメモリにコピーする代わりに、イメージをプロセスのアドレス空間にマップしてみてください。ファイルの必要な部分だけをマップできます。

于 2009-10-19T11:47:58.003 に答える
0

代わりに、配列のセクションを操作する必要はありません。どんな助けでも大歓迎です。

メモリマップトファイルを調べましたか?

于 2009-10-19T11:53:21.973 に答える
0

うん、キリルが指摘したように、ヒープの断片化のように聞こえます。参照:ヒープの断片化を回避する方法は?

于 2009-10-19T11:55:43.447 に答える