Al procesar archivos grandes, si utiliza FileInputStream o FileOutputStream o RandomAccessFile para realizar operaciones frecuentes de lectura y escritura, el proceso se ralentizará debido a la lectura y escritura frecuentes en la memoria externa. El siguiente es un experimento comparativo.
Copie el código de código de la siguiente manera:
prueba de paquete;
importar java.io.BufferedInputStream;
importar java.io.FileInputStream;
importar java.io.FileNotFoundException;
importar java.io.IOException;
importar java.io.RandomAccessFile;
importar java.nio.MappedByteBuffer;
importar java.nio.channels.FileChannel;
Prueba de clase pública {
público estático vacío principal (String [] argumentos) {
intentar {
FileInputStream fis=new FileInputStream("/home/tobacco/test/res.txt");
suma int=0;
int n;
largo t1=System.currentTimeMillis();
intentar {
mientras((n=fis.read())>=0){
suma+=n;
}
} captura (IOException e) {
// TODO Bloque de captura generado automáticamente
e.printStackTrace();
}
largo t=System.currentTimeMillis()-t1;
System.out.println("suma:"+suma+" tiempo:"+t);
} captura (FileNotFoundException e) {
// TODO Bloque de captura generado automáticamente
e.printStackTrace();
}
intentar {
FileInputStream fis=new FileInputStream("/home/tobacco/test/res.txt");
BufferedInputStream bis=new BufferedInputStream(fis);
suma int=0;
int n;
largo t1=System.currentTimeMillis();
intentar {
mientras((n=bis.read())>=0){
suma+=n;
}
} captura (IOException e) {
// TODO Bloque de captura generado automáticamente
e.printStackTrace();
}
largo t=System.currentTimeMillis()-t1;
System.out.println("suma:"+suma+" tiempo:"+t);
} captura (FileNotFoundException e) {
// TODO Bloque de captura generado automáticamente
e.printStackTrace();
}
Búfer MappedByteBuffer = nulo;
intentar {
buffer=new RandomAccessFile("/home/tobacco/test/res.txt","rw").getChannel().map(FileChannel.MapMode.READ_WRITE, 0, 1253244);
suma int=0;
int n;
largo t1=System.currentTimeMillis();
para(int i=0;i<1253244;i++){
n=0x000000ff&buffer.get(i);
suma+=n;
}
largo t=System.currentTimeMillis()-t1;
System.out.println("suma:"+suma+" tiempo:"+t);
} captura (FileNotFoundException e) {
// TODO Bloque de captura generado automáticamente
e.printStackTrace();
} captura (IOException e) {
// TODO Bloque de captura generado automáticamente
e.printStackTrace();
}
}
}
El archivo de prueba es un archivo con un tamaño de 1253244 bytes. Resultados de la prueba:
Copie el código de código de la siguiente manera:
suma:220152087 hora:1464
suma:220152087 hora:72
suma:220152087 hora:25
Indica que los datos leídos son correctos. Eliminar la parte de procesamiento de datos.
Copie el código de código de la siguiente manera:
prueba de paquete;
importar java.io.BufferedInputStream;
importar java.io.FileInputStream;
importar java.io.FileNotFoundException;
importar java.io.IOException;
importar java.io.RandomAccessFile;
importar java.nio.MappedByteBuffer;
importar java.nio.channels.FileChannel;
Prueba de clase pública {
público estático vacío principal (String [] argumentos) {
intentar {
FileInputStream fis=new FileInputStream("/home/tobacco/test/res.txt");
suma int=0;
int n;
largo t1=System.currentTimeMillis();
intentar {
mientras((n=fis.read())>=0){
//suma+=n;
}
} captura (IOException e) {
// TODO Bloque de captura generado automáticamente
e.printStackTrace();
}
largo t=System.currentTimeMillis()-t1;
System.out.println("suma:"+suma+" tiempo:"+t);
} captura (FileNotFoundException e) {
// TODO Bloque de captura generado automáticamente
e.printStackTrace();
}
intentar {
FileInputStream fis=new FileInputStream("/home/tobacco/test/res.txt");
BufferedInputStream bis=new BufferedInputStream(fis);
suma int=0;
int n;
largo t1=System.currentTimeMillis();
intentar {
mientras((n=bis.read())>=0){
//suma+=n;
}
} captura (IOException e) {
// TODO Bloque de captura generado automáticamente
e.printStackTrace();
}
largo t=System.currentTimeMillis()-t1;
System.out.println("suma:"+suma+" tiempo:"+t);
} captura (FileNotFoundException e) {
// TODO Bloque de captura generado automáticamente
e.printStackTrace();
}
Búfer MappedByteBuffer = nulo;
intentar {
buffer=new RandomAccessFile("/home/tobacco/test/res.txt","rw").getChannel().map(FileChannel.MapMode.READ_WRITE, 0, 1253244);
suma int=0;
int n;
largo t1=System.currentTimeMillis();
para(int i=0;i<1253244;i++){
//n=0x000000ff&buffer.get(i);
//suma+=n;
}
largo t=System.currentTimeMillis()-t1;
System.out.println("suma:"+suma+" tiempo:"+t);
} captura (FileNotFoundException e) {
// TODO Bloque de captura generado automáticamente
e.printStackTrace();
} captura (IOException e) {
// TODO Bloque de captura generado automáticamente
e.printStackTrace();
}
}
}
Resultados de la prueba:
Copie el código de código de la siguiente manera:
suma:0 tiempo:1458
suma:0 tiempo:67
suma:0 tiempo:8
Se puede ver que la velocidad mejorará enormemente al asignar parte o la totalidad del archivo a la memoria para lectura y escritura.
Esto se debe a que el archivo mapeado en memoria primero asigna el archivo en la memoria externa a un área continua en la memoria, que se trata como una matriz de bytes. Las operaciones de lectura y escritura operan directamente en la memoria y luego reasignan el área de memoria a la. Memoria externa, lo que ahorra el tiempo de lectura y escritura frecuentes del almacenamiento externo y reduce en gran medida el tiempo de lectura y escritura.