11

byte[] get(offset, length)一般的に言えば、Java で 2GB を超えるメモリ マップト ファイルのメソッドをどのように実装しますか。

コンテキスト付き:

ランダム i/o で 2GB を超えるファイルを効率的に読み込もうとしています。もちろん、アイデアは Java nio とメモリマップ API を使用することです。

問題は、メモリ マッピングの 2GB の制限に伴います。解決策の 1 つは、2 GB の複数のページをマップし、オフセットを使用してインデックスを作成することです。

ここに同様の解決策があります:

Javaでソートされた(メモリマップされた?)ファイルでのバイナリ検索

このソリューションの問題は、API が読み取ることになっているときにバイトを読み取るように設計されていることですbyte[](したがって、API は のようなものになりますread(offset, length))。

get()そのアルティメットをに変更するだけでうまくいくでしょうget(offset, length)か?byte[]i'm reading が 2 つのページの間にある場合はどうなりますか?

4

1 に答える 1

4

いいえ、ソートされた(メモリマップされた?)バイナリ検索に対する私の答えは、あなたが疑うように、メモリマップされたファイル配列の境界のために変更get()することはできません。get(offset, length)考えられる解決策は 2 つあります。

  1. メモリ マップされたファイルをオーバーラップします。 読み取りを行うときは、読み取りの開始バイトの直前に開始バイトがあるメモリ マップド ファイルを選択します。このアプローチは、最大メモリ マップ サイズの 50% を超える読み取りでは機能しません。
  2. 2 つの異なるメモリ マップ ファイルから読み取るバイト配列作成メソッドを作成します。 結果の配列がメモリマップされないため、パフォーマンスの向上の一部が失われると思うので、私はこのアプローチに熱心ではありません。
于 2011-04-06T07:18:30.527 に答える