5

大量のキー (2600 万以上) をサポートするディスク ベースのハッシュテーブルを実装しています。値は逆シリアル化されます。読み取りは基本的にファイル全体でランダムであり、値はページ サイズより小さく、SSD 用に最適化しています。安全性/一貫性はそれほど大きな問題ではありません (パフォーマンスの問題)。

私の現在の解決策は、カーネルによるプリフェッチを無効にし、オンデマンドで必要なデータのみをロードするように設定されたmmap()ファイルを使用することです。MADV_RANDOM | MADV_DONTNEED

カーネルがディスクからメモリ バッファに読み取り、そこから逆シリアル化するという考えが浮かびました。

どうO_DIRECTですか?を呼び出しread()た場合、(逆シリアル化した) バッファーにまだコピーしているので、利点を得ることができますか?

ファイルに関連するバッファとで開かれたファイルのmmap()呼び出しに関する詳細情報はどこにありますか?read()O_DIRECT

先読みやキャッシングには興味がありません。私のユースケースに提供するものは何もありません。

4

1 に答える 1

6

O_DIRECT は、データがシステム バッファをバイパスし、バッファからディスク コントローラに直接コピーされる場合の読み取り/書き込み操作のオプションです。O_DIRECT の利点を得るには、いくつかの条件に準拠する必要があります - メモリ ページ バッファー アドレスで整列し、I/O ブロックで整列されたバッファー サイズを維持します。

とにかく、mmap を使用する場合は、読み取り/書き込みを使用しません。さらに、mmap の後、ファイル記述子を閉じることができ、マッピングは引き続き機能します。したがって、O_DIRECT は mmap オプションでは役に立ちません。

パフォーマンスを向上させるために何をお勧めしますか:

  1. サブシステムでキーが欠落している検索要求が多数ある場合は、メモリ内にブルーム フィルターを作成できます。その後、ブルーム フィルターhttp://en.wikipedia.org/wiki/Bloom_filterで検索キーを照合し、ディスクへの実際の要求なしで、不足しているキーを拒否します。

  2. メモリを節約するには、2 レベル スキームを使用します。バケット ヘッドは mmap-ed メモリに保持しますが、バケット自体は pread() によってファイルから読み取ります。

私のオートコンプリート サブシステムに実装した両方のオプションは、オンラインでここで見ることができます: http://olegh.ftp.sh/autocomplete.htmlで、低速の古いコンピューター - Celeron-300 でのパフォーマンスを見積もることができます。

于 2013-11-12T16:12:19.663 に答える