0

を使用してファイルを読み取るのは非常にMapped FileChannel高速なようです...しかし、私は彼らがこれをどのように行っているのか疑問に思いましたか?

彼らは単に大きな(〜64kB)バッファーを読み取って、それを行進させているだけですか?それともそれ以上のものがありますか?

私はスピードに感銘を受け、その背後にあるアルゴリズムをよりよく理解したいと思っています。

4

2 に答える 2

2

彼らはあなたが読むまで何も読みません、そしてあなたが読んだ部分は基本的にOSページングシステムを介して読まれます。オープンにはほとんど費用がかからないかもしれませんが、ファイルの同じ部分を繰り返し読み取ると、I/Oが繰り返される可能性があります。無料のものはありません。

于 2012-12-16T08:57:16.727 に答える
1

メモリマッピング、ファイルをメモリにマップし、Javaはこれをラップするためのライブラリを提供するため、比較的安全にアクセスできます。

利点は次のとおりです。

  • メモリ、OSディスクキャッシュ、およびアプリケーションのメモリには1つのコピーしかありません。
  • システムコールなしでファイルのランダムな領域にアクセスできます。
  • Javaは、マップできる量を制限します。つまり、最大ヒープが1 GBで、最大ダイレクトメモリが1 GBの場合でも、1TBでマップできます。

欠点は次のとおりです。

  • 仮想メモリを消費しますが、ファイルを再マップまたは閉じると、仮想メモリは返されません。64ビットJVMを使用している場合、これはそのような問題ではありませんが、1 GBしか空きがない可能性がある32ビットJVMを使用している場合は、非常に制限があります。GCの実行時に仮想メモリを解放します。
  • 一度に最低1ページの読み取り/書き込みを行います。これは、ランダムアクセスがたくさんある場合は便利ですが、ディスク上の多くのファイルの読み取り/書き込みを行う場合は、実際にはシーケンシャルアクセスが遅くなります。一度に4KBずつランダムに多くのファイルに追加すると、ファイルが非常に断片化する可能性がありますが、これは考えられないことです。
  • メモリマップトファイルの操作は、プレーンなDataXxxxStreamまたはBufferedReader/Writerを使用するよりも難しい場合があります。

メモリマップトファイルの操作を容易にするライブラリをいくつか作成しました。超低遅延が重要な場合や、ディスクキャッシュにあると予想される大量のメモリを読み取る必要がある場合に使用します。ディスクキャッシュを最大限に活用したい。

マップされたメモリがディスクサブシステムを高速化するわけではなく、それが制限要因である場合は、データの読み取り/書き込み方法は重要ではないことに注意してください。

于 2012-12-16T10:12:14.273 に答える