J'utilise des E/S mappées en mémoire pour un fichier d'index, mais le problème est que je ne suis pas en mesure de redimensionner le fichier s'il est presque vide.Tronquer le fichier mappé en mémoire
Quelque part avant:
MappedByteBuffer map = raf.getChannel().map(MapMode.READ_WRITE, 0, 1 << 30);
raf.close();
// use map
map.force();
map = null;
Redimensionner:
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();
}
}
Lorsque vous utilisez Windows ou Linux 32 bits J'ai souvent le problème démappage, mais dans l'environnement de production Linux 64 bits tout semble fonctionner sans avertissement, mais le fichier conserve la taille d'origine.
Quelqu'un peut-il expliquer pourquoi cela se produit et/ou comment résoudre le problème?
Je crains que le problème ne dépende en quelque sorte de NFS, de la mise en cache ou du timing car il semble avoir été résolu sans intervention réelle (il suffit d'ajouter la journalisation et l'attente et maintenant cela fonctionne).Même les fichiers qui se sont apaisés après la troncatureg et qui n'ont pas été touchés depuis ont maintenant la bonne taille. Peut-être que la journalisation de la nouvelle taille de fichier après la mise à jour du cache nfs est tronquée. – rurouni
Le problème discuté est similaire à [Comment démonter un fichier] (http://stackoverflow.com/questions/2972986), en particulier, voir [bug # 4724038] (http://bugs.sun.com/view_bug. do? bug_id = 4724038). –