Я использую 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();
}
}
При использовании 32-разрядной версии Windows или Linux у меня часто возникает проблема с отображением, но в 64-битной производственной среде Linux все работает без предупреждений, но файл сохраняет исходный размер.
Может ли кто-нибудь объяснить, почему это происходит и/или как решить проблему?