인덱스 파일에 대해 메모리 매핑 된 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 또는를 사용하여
리눅스 32 비트 나는 종종 매핑 해제 문제가 있지만, 64 비트 Linux 프로덕션 환경에서 모든 작동하는 것 같다 경고없이, 파일은 원래 크기를 유지합니다.왜 이런 일이 발생했는지 그리고 문제를 어떻게 해결할 수 있는지 설명 할 수 있습니까?
저는 어떻게 든 NFS, 캐싱 또는 타이밍에 의존한다는 것을 두려워합니다. 실제 간섭없이 해결 된 것으로 보입니다. (그냥 로깅을 추가하고 대기하고 지금은 작동합니다.)이후 truncationg 후에 커다란 화제를 한 파일들과 지금까지 건드리지 않은 파일들도 정확한 크기를 가지고 있습니다. 어쩌면 truncate 후 새 파일 크기의 로깅은 일부 nfs 캐시를 업데이트합니다. – rurouni
문제는 [파일을 해제하는 방법] (http://stackoverflow.com/questions/2972986)과 유사합니다. 특히 [버그 # 4724038] (http://bugs.sun.com/view_bug)를 참조하십시오. do? bug_id = 4724038). –