2011-11-09 16 views
1

免責事項:これは私が探しているものを見つけることができないため、おそらく研究の質問です。共有されたmmapファイルを管理するためのライブラリまたはツール

問題:私は、それぞれ0.01MBから約10.0MBの間の100Kから10Mのファイルを読み込む必要のあるカスタム検索アプリケーションを持っています。各ファイルにはmmap経由で配列として直接ロードできる1つの配列が含まれています。私は、必要になる前にRAMにファイルをプリフェッチするためのソリューションを探しています。システムメモリがいっぱいであれば、すでに処理されたものを取り出します。

これは、OSのメモリ管理とmemcachedのようなものがよく似ています。私が実際に探しているのは、キーの文字列や値を返さないmemcachedのようなものですが、選択した配列の先頭のアドレスです。さらに、(これは別の話題ですが)NUMAマシンでCPUコアとRAMの距離が最短になるように共有メモリを管理したいと考えています。

私の質問です:「このようなツール/ライブラリは既に存在しますか?」

答えて

1

ご質問はthis one

に関連している私は、あなたがライブラリを見つける必要があるかわかりません。システムコールを効率的に使用する方法を理解する必要があります。

readaheadシステムコールがお役に立てると思います。

+0

あなたのコメントは正しい方向に向いています。この質問と[other](http://stackoverflow.com/questions/8056984/speeding-up-file-io-mmap-vs-read)の主な違いは、ファイルの数が多いことですが、各ファイル比較的小さい。他の場合には、その反対が真である。私が本当にしなければならないことは、(消費者の視点からは)I/Oを非ブロック化し、消費者がまだ読んでいないファイルをカーネルがページアウトしないようにすることです。十分なメモリがあれば、私はすべての配列をメモリに保持するだけです。 –

+0

次の秒でどのファイル(またはその一部)が必要になるか予測できるならば、 'readahead'システムコール(おそらく別のスレッド)を使って助けてください。 –

+0

私はreadaheadがブロッキングコールであると少し気になります。また、この質問の主な動機は、I/Oパターンが重要であるように見える1つのCPUコアであり、多くのコアを飢えさせることなく拡大したいと考えていることです。もう1つの問題(別の問題)は、ほとんどのI/Oプロファイラーが1つのスレッドを持つプロセスのためにバグがあり、マルチスレッドプロセスの方がはるかに悪いです。 –

0

実際には、多くのファイルがあります(あまりにも多くのファイルがあります)。私はあなたのファイルシステムが十分であること、あるいは多くのディレクトリにあることを願っています。適切に調整されなければ、何百万ものファイルが懸念されるかもしれません(しかし、私はこれについて助けてくれません)。

あなたのアプリケーションであるかどうか分かりませんが、&はそのファイルを多く読み取ります。おそらく、DBMSPostGresQLまたはMySQLなど)に切り替えることを検討してください。おそらくGDBMを使用することもできます。

+0

これまでMySQLを使用しようとしましたが、Linuxファイルシステムからファイルを読み込むのに比べて約10倍の時間がかかります。また、アプリケーションは、以下で説明する検索エンジンのようなものです。読み取り速度は何をカウントし、書き込みは定期的に行われ、以前のデータは上書きされず、遅くなる可能性があります。 –

+0

GDBMも役立つかもしれません。私はそれがMySQLより速く、おそらく数百万のファイルを持つファイルシステムよりも速いと信じています。 –

0

検索エンジンの種類のアプリケーションでこれをやったことがあります。これは、ファイルIDとメモリアドレスIIRCによって(ハッシュテーブルを介して)アドレス指定可能なLRUチェーンを使用していました。すべてのアクセスで、のホットアイテムがLRUチェーンのヘッドに再配置されました。メモリが逼迫したとき(mmap が失敗する...)、LRUチェーンの末尾はマップされていませんでした。

このスキームの落とし穴は、プログラムがページフォールトでブロックされる可能性があることです。シングルスレッドだったので、が本当ににブロックされました。これをマルチスレッドアーキテクチャに変更するには、ハッシュおよびLRU構造をロックおよびセマフォで保護する必要があります。

その後、私はダブルバッファリングを実行していることに気付きました。OS自体には完璧なLRUディスクバッファーメカニズムがありますが、これはおそらくよりスマートです。リクエストごとに1つのファイルをopen()またはmmap()するだけで、1つのsytemcall離れて、(最近のアクティビティでは)バッファリングレイヤと同じ速さ、またはさらに高速です。

wrt DBMS:DBMSを使用するのはクリーンな設計ですが、データの最初のブロックを取得するだけで最小3つのシステムコールのオーバーヘッドがあります。そしてそれは確かに(常に)のブロックになります。しかし、それはマルチスレッド設計には合理的に役立ち、ロックやバッファ管理の苦痛から解放されます。

+0

私はこれらの行に沿って考えてきました。私たちは、データセット全体を保持するのに十分なRAMを備えた専用マシンを購入するかもしれません。私の手では、C++のfstream、read()、mmapの使用に違いはありませんでした。 OSが十分なファイルバッファ領域があると認識する限り、読み込みはかなり高速です。 –

関連する問題