我正在处理大文件,并使用MappedByteBuffer进行读写操作。由于我对它不太了解,所以有一些疑问。
MappedByteBuffer buf = raf.getChannel().map(FileChannel.MapMode.READ_WRITE, offset, size);
1. 我知道ByteBuffer的限制是整数最大值,那么我应该如何设置MappedByteBuffer的大小?应该使用小块还是整数最大值? 当我增加映射大小时,我的应用程序的读写性能是否也会提高?
2. 当这个大小增加时,我同时的内存使用量也会增加吗?我之所以有这个疑问,是因为我需要创建多个文件进行读写。 如果一个文件分配了2GB的内存,而我有6个文件,那么我需要12GB内存,或者我的想法完全错误。
3. 这与JVM-Xmx还是我的物理内存有关吗?
这是我的用法:
MappedByteBuffer buf = raf.getChannel().map(FileChannel.MapMode.READ_WRITE, offset, size);
1. 我知道ByteBuffer的限制是整数最大值,那么我应该如何设置MappedByteBuffer的大小?应该使用小块还是整数最大值? 当我增加映射大小时,我的应用程序的读写性能是否也会提高?
2. 当这个大小增加时,我同时的内存使用量也会增加吗?我之所以有这个疑问,是因为我需要创建多个文件进行读写。 如果一个文件分配了2GB的内存,而我有6个文件,那么我需要12GB内存,或者我的想法完全错误。
3. 这与JVM-Xmx还是我的物理内存有关吗?
这是我的用法:
List<MappedByteBuffer> mappings = new ArrayList<MappedByteBuffer>();
int mSize = 25;
long MAPPING_SIZE = 1 << mSize;
File file = File.createTempFile("test", ".dat");
RandomAccessFile raf = new RandomAccessFile(file, "rw");
ByteOrder byteOrder = java.nio.ByteOrder.nativeOrder(); // "LITTLE_ENDIAN";
try {
long size = 8L * width * height;
for (long offset = 0; offset < size; offset += MAPPING_SIZE) {
long size2 = Math.min(size - offset, MAPPING_SIZE);
MappedByteBuffer buf = raf.getChannel().map(FileChannel.MapMode.READ_WRITE, offset, size2);
buf.order(byteOrder);
mappings.add(buf);
}
}