3

calloc1 ギガバイトをわずかに超える 1 つの要素を呼び出す必要があります。この呼び出しは を返しNULL、errno をチェックするとメモリ不足エラーが明らかになります。ただし、テスト中、使用可能な仮想メモリは言うまでもなく、ほぼ 4 ギガバイトの空き RAM があります。

この問題を調査した後、なぜ失敗したかについて思いつくことができる唯一のことは、使用可能な連続したメモリcallocが十分にないということです。ただし、4Gb の使用可能なメモリがあれば、~= 1Gb の連続したメモリを使用するのは簡単なはずです。連続したメモリの可用性を確認する方法はありますか? これが問題である場合、メモリを「最適化」する簡単な方法はありますか?

それとも、これは割り当てられたメモリのブロックサイズと関係があるので、実際には利用可能なメモリよりも多くのメモリを割り当てようとしていますか? 失敗の原因を特定するためのオプションは何ですか? この大量のメモリを正常に割り当てるためのオプションは何ですか?

12Gb のメモリを搭載したネイティブ Windows システムを使用しています。次に、VM で実行して、VM に数ギガバイトのメモリを割り当て、仮想マシンが十分な連続メモリに非透過的にアクセスできるかどうかを確認します。今日それを完了したら、ここに結果を投稿します。

4

1 に答える 1

6

これを成功させるための重要な鍵の 1 つは、1 GB の仮想アドレス空間をアプリケーションで利用できるようにすることです。32 ビット Windows アプリケーションでは、デフォルトの状況では、アプリケーションは基本的に 2 GB のアドレス空間で開始されます。

失敗したアプリケーションの前にアプリケーションで非常に多くの割り当てを行う場合、元のアドレス空間を十分に分割して、1GB の連続したアドレス空間を残さないようにしている可能性があります。アプリケーションは、残りの部分がすべて 1GB 未満になるようにアドレス空間を分割する 2 つの小さな「戦略的に配置された」割り当てを実行できます。

于 2012-08-25T00:03:23.177 に答える