ファイルが Integer.MAX_VALUE より大きい場合でも、java.nio.MappedByteBuffer を使用しない理由はわかりません。
明らかに、ファイル全体に対して単一の MappedByteBuffer を定義することは許可されません。ただし、ファイルの異なる領域にアクセスする複数の MappedByteBuffers を持つことができます。
FileChannel.map の位置とサイズの定義は long 型です。これは、Integer.MAX_VALUE を超える値を指定できることを意味します。注意しなければならないことは、バッファーのサイズがInteger.MAX_VALUE より大きくならないようにすることだけです。 .
したがって、次のようにいくつかのマップを定義できます。
buffer[0] = fileChannel.map(FileChannel.MapMode.READ_WRITE,0,2147483647L);
buffer[1] = fileChannel.map(FileChannel.MapMode.READ_WRITE,2147483647L, Integer.MAX_VALUE);
buffer[2] = fileChannel.map(FileChannel.MapMode.READ_WRITE, 4294967294L, Integer.MAX_VALUE);
...
要約すると、サイズを Integer.MAX_VALUE より大きくすることはできませんが、開始位置はファイル内のどこにでも置くことができます。
Book Java NIOで、著者の Ron Hitchens は次のように述べています。
メモリ マッピング メカニズムを介してファイルにアクセスすると、チャネルを使用している場合でも、従来の方法でデータを読み書きするよりもはるかに効率的です。時間のかかる明示的なシステム コールを行う必要はありません。さらに重要なことは、オペレーティング システムの仮想メモリ システムがメモリ ページを自動的にキャッシュすることです。これらのページはシステム メモリを使用してキャッシュされ、JVM のメモリ ヒープのスペースを消費しません。
メモリ ページが有効になると (ディスクから取り込まれると)、データを取得するために別のシステム コールを行う必要なく、フル ハードウェア スピードで再度アクセスできます。頻繁に参照または更新されるインデックスまたはその他のセクションを含む大規模な構造化ファイルは、メモリ マッピングから大きなメリットを得ることができます。クリティカル セクションを保護し、トランザクションの原子性を制御するためにファイル ロックと組み合わせると、メモリ マップト バッファを有効に活用できることがわかります。
サードパーティの API がそれよりも優れた機能を提供しているとは思えません。おそらく、作業を簡素化するために、このアーキテクチャの上に書かれた API を見つけるかもしれません。
このアプローチはあなたのために働くべきだと思いませんか?