截断内存映射文件
我正在对索引文件使用内存映射IO,但问题是,如果文件大部分为空,则我无法调整文件大小。
之前的某个地方:
MappedByteBuffer map = raf.getChannel().map(MapMode.READ_WRITE, 0, 1 << 30);
raf.close();
// use map
map.force();
map = null;
调整:
for (int c = 0; c < 100; c++) {
RandomAccessFile raf = new RandomAccessFile(indexFile, "rw");
try {
raf.setLength(newLen);
if (c > 0) LOG.warn("used " + c + " iterations to close mapped byte buffer");
return;
} catch (Exception e) {
System.gc();
Thread.sleep(10);
System.runFinalization();
Thread.sleep(10);
} finally {
raf.close();
}
}
使用Windows或Linux 32位时,我经常遇到取消映射的问题,但在64位Linux生产环境中,一切似乎都可以正常工作而没有警告,但文件保持原始大小。
任何人都可以解释为什么会发生这种情况和/或如何解决问题?