Wenn Sie bei der Verarbeitung großer Dateien häufige Lese- und Schreibvorgänge mit gewöhnlichem FileInputStream oder FileOutputStream oder RandomAccessFile durchführen, verlangsamt sich der Prozess aufgrund des häufigen Lesens und Schreibens im externen Speicher. Das Folgende ist ein Vergleichsexperiment.
Kopieren Sie den Codecode wie folgt:
Pakettest;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
öffentlicher Klassentest {
public static void main(String[] args) {
versuchen {
FileInputStream fis=new FileInputStream("/home/tobacco/test/res.txt");
int sum=0;
int n;
long t1=System.currentTimeMillis();
versuchen {
while((n=fis.read())>=0){
Summe+=n;
}
} Catch (IOException e) {
// TODO Automatisch generierter Catch-Block
e.printStackTrace();
}
long t=System.currentTimeMillis()-t1;
System.out.println("sum:"+sum+" time:"+t);
} Catch (FileNotFoundException e) {
// TODO Automatisch generierter Catch-Block
e.printStackTrace();
}
versuchen {
FileInputStream fis=new FileInputStream("/home/tobacco/test/res.txt");
BufferedInputStream bis=new BufferedInputStream(fis);
int sum=0;
int n;
long t1=System.currentTimeMillis();
versuchen {
while((n=bis.read())>=0){
Summe+=n;
}
} Catch (IOException e) {
// TODO Automatisch generierter Catch-Block
e.printStackTrace();
}
long t=System.currentTimeMillis()-t1;
System.out.println("sum:"+sum+" time:"+t);
} Catch (FileNotFoundException e) {
// TODO Automatisch generierter Catch-Block
e.printStackTrace();
}
MappedByteBuffer buffer=null;
versuchen {
buffer=new RandomAccessFile("/home/tobacco/test/res.txt","rw").getChannel().map(FileChannel.MapMode.READ_WRITE, 0, 1253244);
int sum=0;
int n;
long t1=System.currentTimeMillis();
for(int i=0;i<1253244;i++){
n=0x000000ff&buffer.get(i);
Summe+=n;
}
long t=System.currentTimeMillis()-t1;
System.out.println("sum:"+sum+" time:"+t);
} Catch (FileNotFoundException e) {
// TODO Automatisch generierter Catch-Block
e.printStackTrace();
} Catch (IOException e) {
// TODO Automatisch generierter Catch-Block
e.printStackTrace();
}
}
}
Die Testdatei ist eine Datei mit einer Größe von 1253244 Bytes. Testergebnisse:
Kopieren Sie den Codecode wie folgt:
Summe:220152087 Zeit:1464
Summe:220152087 Zeit:72
Summe:220152087 Zeit:25
Es zeigt an, dass die gelesenen Daten korrekt sind. Löschen Sie den Datenverarbeitungsteil.
Kopieren Sie den Codecode wie folgt:
Pakettest;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
öffentlicher Klassentest {
public static void main(String[] args) {
versuchen {
FileInputStream fis=new FileInputStream("/home/tobacco/test/res.txt");
int sum=0;
int n;
long t1=System.currentTimeMillis();
versuchen {
while((n=fis.read())>=0){
//sum+=n;
}
} Catch (IOException e) {
// TODO Automatisch generierter Catch-Block
e.printStackTrace();
}
long t=System.currentTimeMillis()-t1;
System.out.println("sum:"+sum+" time:"+t);
} Catch (FileNotFoundException e) {
// TODO Automatisch generierter Catch-Block
e.printStackTrace();
}
versuchen {
FileInputStream fis=new FileInputStream("/home/tobacco/test/res.txt");
BufferedInputStream bis=new BufferedInputStream(fis);
int sum=0;
int n;
long t1=System.currentTimeMillis();
versuchen {
while((n=bis.read())>=0){
//sum+=n;
}
} Catch (IOException e) {
// TODO Automatisch generierter Catch-Block
e.printStackTrace();
}
long t=System.currentTimeMillis()-t1;
System.out.println("sum:"+sum+" time:"+t);
} Catch (FileNotFoundException e) {
// TODO Automatisch generierter Catch-Block
e.printStackTrace();
}
MappedByteBuffer buffer=null;
versuchen {
buffer=new RandomAccessFile("/home/tobacco/test/res.txt","rw").getChannel().map(FileChannel.MapMode.READ_WRITE, 0, 1253244);
int sum=0;
int n;
long t1=System.currentTimeMillis();
for(int i=0;i<1253244;i++){
//n=0x000000ff&buffer.get(i);
//sum+=n;
}
long t=System.currentTimeMillis()-t1;
System.out.println("sum:"+sum+" time:"+t);
} Catch (FileNotFoundException e) {
// TODO Automatisch generierter Catch-Block
e.printStackTrace();
} Catch (IOException e) {
// TODO Automatisch generierter Catch-Block
e.printStackTrace();
}
}
}
Testergebnisse:
Kopieren Sie den Codecode wie folgt:
Summe:0 Zeit:1458
Summe:0 Zeit:67
Summe:0 Zeit:8
Es ist ersichtlich, dass die Geschwindigkeit erheblich verbessert wird, wenn ein Teil oder die gesamte Datei zum Lesen und Schreiben im Speicher abgelegt wird.
Dies liegt daran, dass die speicherzugeordnete Datei die Datei im externen Speicher zunächst einem kontinuierlichen Bereich im Speicher zuordnet, der als Byte-Array behandelt wird. Die Lese- und Schreibvorgänge werden direkt auf den Speicher angewendet und dann der Speicherbereich neu zugeordnet externe Speicherdatei, die die Zeit des häufigen Lesens und Schreibens des externen Speichers spart und die Lese- und Schreibzeit erheblich verkürzt.