1

FileChannel#mapファイルをマップする (つまり、メモリ マップを開始する) ために使用される は、long長さパラメーターとして受け取ります。

それでも、ドキュメントにFileChannel#mapは次のよう に書かれています。

size - マップされる領域のサイズ。負ではなく、Integer.MAX_VALUE 以下でなければなりません

まず第一に、最大値しか許可しないのに、そもそも long を使用するのはなぜInteger.MAX_VALUEですか? それよりも大きなファイルを一度にマップすることは何とか可能ですか?

たとえば、10GB のファイルをマップしたい場合、次のように書きたいと思います (InvalidArgumentException長すぎるために最終的には になります)。

long length = 10_000_000_000;
MappedByteBuffer buffer = (new RandomAccessFile("./memory.map", "rw")).getChannel().map(FileChannel.MapMode.READ_WRITE, 0, length);

そのために連続したメモリ マップを作成する必要がありますか。

4

2 に答える 2

3

FileChannel#map はByteBufferのインスタンス(MappedByteBuffer) を返します。これを見るとint、データのインデックス作成にのみ使用されるメソッドであることがわかります。たとえば、次のようになります。

abstract byte get(int index) 絶対getメソッド。

mapそれ自体の制限も定義します。

そのため、ファイルを 1 つずつマップするか、https ://github.com/xerial/larray などの既存のライブラリを使用して、JNI を使用して 2GB を超えるファイルをマップし、それを提供するより大きなファイルをマップする必要があります。longデータ ポインターを使用したバッファーの抽象化。

もう 1 つのオプションは、ここで説明されているように、安全でない操作を使用することです。

于 2017-11-22T15:11:06.820 に答える