2017-11-22 8 views
0

FileChannel#mapは、長さパラメータとしてlongをとります。しかしInteger.MAX_VALUEより大きいJavaのファイルをメモリマップする方法はありますか?ファイルをマップする(すなわち、メモリマップを開始する)ために使用される

the documentation on FileChannel#mapは、次の言葉:

サイズ - マッピングされる領域の大きさ。彼らは唯一のInteger.MAX_VALUEまでの値を許可した場合、なぜ彼らは最初の場所で長く使用しない、非負とInteger.MAX_VALUEのすべての

まず超えないでなければなりませんか? それ以上のファイルを一度にマップすることはどういうことですか?私は10ギガバイトのファイルをマップしたい場合

例えば、私は(これは大きすぎる長さInvalidArgumentExceptionで終わる)このような何かを書きたいと思います:

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

私が持っていますかそのための連続したメモリマップを作成します。たとえば、与えられたファイルの2GBをマッピングする5つのメモリマップ?

答えて

1

のFileChannel#マップはByteBuffer、 (れるMappedByteBuffer)のインスタンスを返しますし、あなたがそれを見れば、あなたはそれが方法が独占的にインデックスにデータ、例えばintを使用していますことがわかります。

抽象バイトが取得を(int index)絶対取得メソッド。

mapの制限も定義しています。

このように、ファイルを1つずつマップするか、既存のライブラリを使用する必要があります(例: https://github.com/xerial/larrayは、JNIを使​​用して2GBを超えるファイルをマップするより大きいファイルをマップし、longデータポインタを使用して独自のバッファ抽象化を提供します。

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

関連する問題