我正在使用內存映射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生產環境中的一切似乎工作沒有警告,但文件保持原來的大小。
任何人都可以解釋爲什麼發生這種情況和/或如何解決問題?
我擔心這個問題在某種程度上取決於NFS,緩存或計時,因爲它似乎解決了沒有真正的干預(只是添加日誌記錄和等待,現在它的工作)。即使是在truncationg之後巨大的文件,以及之後未被觸及的文件現在都具有正確的大小。也許在截斷之後記錄新的文件大小會更新一些nfs緩存。 – rurouni 2011-05-13 11:09:32
正在討論的問題類似於[如何取消映射文件](http://stackoverflow.com/questions/2972986),具體請參見[bug#4724038](http://bugs.sun.com/view_bug。怎麼辦?bug_id = 4724038)。 – 2012-05-21 12:50:52