Estoy usando MappedByteBuffer para acelerar las operaciones de lectura/escritura de archivos(). Mis preguntas como abajo:¿Necesitamos usar MappedByteBuffer.force() para vaciar datos en el disco?
no estoy seguro si necesito utilizar el método .force() para volcar el contenido en el disco o no. Parece que sin .force(), el .getInt() todavía puede funcionar perfectamente (bueno, dado que se trata de un búfer mapeado en memoria, supongo que .getInt() busca los datos del disco, lo que significa que los datos se han descargado a ya disco.
es el método .force() un método de bloqueo?
es un método de bloqueo de un bloque sincronizado?
Hay una gran diferencia de rendimiento con o sin llamar .force () Método: ¿Cuál es el beneficio de llamar a .force() manualmente? ¿Bajo qué situación deberíamos usar? Supongo que, sin llamarlo, los datos se escribirán en el disco detrás de la escena.
Si necesitamos llamar a .force(), ¿lo llamará desde otro subproceso para mejorar el rendimiento? ¿Corromperá los datos debido a un problema de sincronización?
import java.io.FileNotFoundException; import java.io.IOException; import java.io.RandomAccessFile; import java.nio.MappedByteBuffer; import java.nio.channels.FileChannel; import java.nio.channels.FileChannel.MapMode;
public class Principal {
public static void main(String[] args) throws IOException {
System.out.println("start");
RandomAccessFile raf = new RandomAccessFile("test.map", "rw");
FileChannel fc = raf.getChannel();
MappedByteBuffer mbb = fc.map(MapMode.READ_WRITE, 0, 2000000);
int total = 0;
long startTime = System.currentTimeMillis();
for (int i = 0; i < 2000000; i += 4) {
mbb.putInt(i, i);
//mbb.force();
total += mbb.getInt(i);
}
long stopTime = System.currentTimeMillis();
System.out.println(total);
System.out.println(stopTime - startTime);
System.out.println("stop");
}
}
¿Versión del JDK? (No es que realmente haya cambiado tanto) –
No veo qué diferencia haría. – EJP
Ninguno después de mirar el Javadoc :-) –