2010-12-08 5 views
3

まず、私はmallocのメモリとcallocのメモリフットプリントが違うことに気付きました。私は数GBのデータセットを扱っています。このデータはランダムでも構いません。Mallocのメモリに関する質問

大量のメモリをmallocして、ランダムなデータがフロートにキャストされているものを読み込むことができます。しかし、プロセスビューアのメモリフットプリントを見ると、メモリは明らかに要求されていません(対私は大きなフットプリントを参照しています)。メモリにデータを書き込むためにループを実行した後、メモリの占有量が増えた。 私はそれを初期化するまでメモリが実際に請求されていないと言って正しいですか?

最後に1024 * 1024 * 128バイト(プロセスビューアで1024 MB)を過ぎた後、私はsegfaultを取得し始めました。しかし、Callocは最大1GBまで初期化されているようです。 mallocで128MBのforループでメモリを初期化するときにsegfaultsが発生する理由と、メモリフットプリントが1024MBになるのはなぜですか?

mallocがメモリから大量に読み込まれている場合は、プロセスビューアには初期化するまでフットプリントがほとんど表示されないため、何が表示されますか?

最後に4GBを超える割り当て方法はありますか?私はメモリ階層のパフォーマンスをテストしています。 #2の

コード:

long long int i; 
    long long int *test=(long long int*)malloc(1024*1024*1024); 
    for (i=0;i<1024*1024*128;i++) 
      test[i]=i; 

    sleep(15); 
+2

32ビットまたは64ビットLinux? –

+3

Linuxは「楽観的なメモリ割り当て戦略」を使用しています。いくつかの情報:http://linux.die.net/man/3/malloc – sje397

+3

*初期化するまでメモリは実際には請求されません*正しいです、それは*レイジー評価*の特別なケースで、OSによって処理されます。しかし、第2の仮定、* 1024 * 1024 * 128バイト== 1Gb *は間違っています。 – ruslik

答えて

2

1- 32ビットマシンで作業している場合、2GBを超える変数を割り当てることはできません。

2 - 64ビットマシンで作業している場合は、合計でRAM +スワップメモリ​​を割り当てることができますが、1つの変数にallを割り当てると大きなメモリが必要になります。リンクされたリストで試してください。各リストには1 MBしか割り当てられておらず、合計でより多くのメモリを割り当てることができます。

3-あなたとSharthが指摘したように、あなたのメモリを使用しない限り、Linuxはそれを割り当てません。

+0

割り当てられたメモリをチャンク単位で分割する必要はありません。 32ビットシステムでは、連続した大きなアドレス空間を見つけるのは難しいですが、64ビットでは問題ありません。 – ruslik

6

いくつかの注意:あなたがそれを使用するまでコメント注意点としては

  1. 、Linuxは実際にあなたのメモリを割り当てません。
  2. mallocではなくcallocを使用すると、要求したすべてのメモリがゼロになります。これはそれを使用するのと同じです。
1

あなたの#2は、sizeof(long long int) > 8か、またはmallocがNULLを返したためにsegfaultで失敗しています。これは、1 GBのRAMを要求している場合は非常に可能です。

#2の詳細情報あなたの128 MBのコメントから、私はあなたが何が起こっているのか分からないかもしれないという考えを得る。配列ポインタをlong long intと宣言しているため、各配列要素のサイズは8バイトです。 1024/8 == 128だから、あなたのループはうまくいきます。それは、とにかくそれを試したときにしました。

1

インデックスコード128 * 1024 * 1024 long longであり、各long longは8バイトですので、サンプルコードのforループは実際に1GBのメモリに触れています。