インデックスファイルにメモリマップド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またはLinux32ビットを使用している場合、マッピング解除の問題が発生することがよくありますが、64ビットLinux実稼働環境では、すべてが警告なしで機能するように見えますが、ファイルは元のサイズを維持します。
なぜこれが起こるのか、そして/または問題を解決する方法を誰かが説明できますか?