3

マシン上で可能な限り大きなハッシュテーブルを作成したいと思います。初期化時にハッシュテーブルで使用するために大きなメモリブロックを要求すると思っていましたが、これを行うための最良の方法がわかりません。以下に、いろいろな考えや質問があります。Stack Overflowには関連する投稿がたくさんありますが、それでもよろしくお願いします。

16GiBのRAMを使って遊ぶとしましょう。

  1. 8GiBのような数を選び、常にそれだけ割り当てて、システムの残りの部分が残りの部分でうまくいくことを期待してください。これを行うことを選択した場合、8GiBを入手するための最良の方法は何ですか?これは64ビットシステムなので、呼び出すmalloc(1<<33)ことができ、機能する可能性がありますが、断片化が問題になる可能性があると思うほど十分に大きいです。では、1GiBの8つの別々のブロックを割り当てるのが最善でしょうか?

  2. 数字を選ぶのではなく、残りの物理メモリのすべて/ほとんどを要求したいと思います。malloc私はそれが戻るまで電話をかけることができると素朴に思っていましたNULLが、楽観的なメモリ割り当てはそれを非常に役に立たないものにします(私のハードドライブもすべて割り当てることができるようです)。のようなユーティリティはtopvmstatメモリ使用量を照会させてくれますが、同じ情報を取得するために使用できるシステムコールはありますか?

  3. この目的のためだけに物理的なメモリが必要なのは正しいですか?これまで使用したことがないのですが、巨大なハッシュテーブルmmapを作成するために検討する必要がありますか?私の本能は、テーブル全体にわたるランダムアクセスはに悪いだろうということでした。mmap

どんな助けでも素晴らしいでしょう!

4

1 に答える 1

-2

システムに十分な RAM がある場合でも、8GB は malloc を使用して割り当てる大きなメモリです。

ここでページングと分割の概念を使用することをお勧めします。

最初に malloc を使用して 256MB のメモリを割り当て、この 256MB を 4K ブロックに分割し、各ブロックに一意のページ インデックスを割り当てて、一意のページ インデックスを使用してアクセスできるようにします。

ページがエントリでいっぱいになると、ページが分割され、別のページ インデックスを持つ新しいページに別の 4k ブロックが割り当てられます。一度にすべてのメモリを割り当てるのではなく、これを続けてください。

于 2013-03-11T06:46:01.013 に答える