เมื่อประมวลผลไฟล์ขนาดใหญ่ หากคุณใช้ FileInputStream หรือ FileOutputStream หรือ RandomAccessFile ธรรมดาในการดำเนินการอ่านและเขียนบ่อยครั้ง จะทำให้กระบวนการช้าลงเนื่องจากการอ่านและเขียนหน่วยความจำภายนอกบ่อยครั้ง ต่อไปนี้เป็นการทดลองเชิงเปรียบเทียบ
คัดลอกรหัสรหัสดังต่อไปนี้:
การทดสอบบรรจุภัณฑ์
นำเข้า java.io.BufferedInputStream;
นำเข้า java.io.FileInputStream;
นำเข้า java.io.FileNotFoundException;
นำเข้า java.io.IOException;
นำเข้า java.io.RandomAccessFile;
นำเข้า java.nio.MappedByteBuffer;
นำเข้า java.nio.channels.FileChannel;
การทดสอบชั้นเรียนสาธารณะ {
โมฆะคงที่สาธารณะ main (String [] args) {
พยายาม {
FileInputStream fis=new FileInputStream("/home/tobacco/test/res.txt");
ผลรวมเต็ม=0;
อินท์เอ็น;
ยาว t1=System.currentTimeMillis();
พยายาม {
ในขณะที่((n=fis.read())>=0){
ผลรวม+=n;
-
} จับ (IOException จ) {
// TODO บล็อก catch ที่สร้างขึ้นอัตโนมัติ
e.printStackTrace();
-
ยาว t=System.currentTimeMillis()-t1;
System.out.println("ผลรวม:"+ผลรวม+" เวลา:"+t);
} จับ (FileNotFoundException จ) {
// TODO บล็อก catch ที่สร้างขึ้นอัตโนมัติ
e.printStackTrace();
-
พยายาม {
FileInputStream fis=new FileInputStream("/home/tobacco/test/res.txt");
BufferedInputStream ทวิ = BufferedInputStream ใหม่ (fis);
ผลรวมเต็ม=0;
อินท์เอ็น;
ยาว t1=System.currentTimeMillis();
พยายาม {
ในขณะที่((n=bis.read())>=0){
ผลรวม+=n;
-
} จับ (IOException จ) {
// TODO บล็อก catch ที่สร้างขึ้นอัตโนมัติ
e.printStackTrace();
-
ยาว t=System.currentTimeMillis()-t1;
System.out.println("ผลรวม:"+ผลรวม+" เวลา:"+t);
} จับ (FileNotFoundException จ) {
// TODO บล็อก catch ที่สร้างขึ้นอัตโนมัติ
e.printStackTrace();
-
บัฟเฟอร์ MappedByteBuffer=null;
พยายาม {
buffer=new RandomAccessFile("/home/tobacco/test/res.txt", "rw").getChannel().map(FileChannel.MapMode.READ_WRITE, 0, 1253244);
ผลรวมเต็ม=0;
อินท์เอ็น;
ยาว t1=System.currentTimeMillis();
สำหรับ(int i=0;i<1253244;i++){
n=0x000000ff&buffer.get(i);
ผลรวม+=n;
-
ยาว t=System.currentTimeMillis()-t1;
System.out.println("ผลรวม:"+ผลรวม+" เวลา:"+t);
} จับ (FileNotFoundException จ) {
// TODO บล็อก catch ที่สร้างขึ้นอัตโนมัติ
e.printStackTrace();
} จับ (IOException จ) {
// TODO บล็อก catch ที่สร้างขึ้นอัตโนมัติ
e.printStackTrace();
-
-
-
ไฟล์ทดสอบเป็นไฟล์ที่มีขนาด 1253244 ไบต์ ผลการทดสอบ:
คัดลอกรหัสรหัสดังต่อไปนี้:
ผลรวม:220152087 เวลา:1464
ผลรวม:220152087 เวลา:72
ผลรวม:220152087 เวลา:25
แสดงว่าข้อมูลที่อ่านถูกต้อง ลบส่วนการประมวลผลข้อมูล
คัดลอกรหัสรหัสดังต่อไปนี้:
การทดสอบบรรจุภัณฑ์
นำเข้า java.io.BufferedInputStream;
นำเข้า java.io.FileInputStream;
นำเข้า java.io.FileNotFoundException;
นำเข้า java.io.IOException;
นำเข้า java.io.RandomAccessFile;
นำเข้า java.nio.MappedByteBuffer;
นำเข้า java.nio.channels.FileChannel;
การทดสอบชั้นเรียนสาธารณะ {
โมฆะคงที่สาธารณะ main (String [] args) {
พยายาม {
FileInputStream fis=new FileInputStream("/home/tobacco/test/res.txt");
ผลรวมเต็ม=0;
อินท์เอ็น;
ยาว t1=System.currentTimeMillis();
พยายาม {
ในขณะที่((n=fis.read())>=0){
//ผลรวม+=n;
-
} จับ (IOException จ) {
// TODO บล็อก catch ที่สร้างขึ้นอัตโนมัติ
e.printStackTrace();
-
ยาว t=System.currentTimeMillis()-t1;
System.out.println("ผลรวม:"+ผลรวม+" เวลา:"+t);
} จับ (FileNotFoundException จ) {
// TODO บล็อก catch ที่สร้างขึ้นอัตโนมัติ
e.printStackTrace();
-
พยายาม {
FileInputStream fis=new FileInputStream("/home/tobacco/test/res.txt");
BufferedInputStream ทวิ = ใหม่ BufferedInputStream (fis);
ผลรวมเต็ม=0;
อินท์เอ็น;
ยาว t1=System.currentTimeMillis();
พยายาม {
ในขณะที่((n=bis.read())>=0){
//ผลรวม+=n;
-
} จับ (IOException จ) {
// TODO บล็อก catch ที่สร้างขึ้นอัตโนมัติ
e.printStackTrace();
-
ยาว t=System.currentTimeMillis()-t1;
System.out.println("ผลรวม:"+ผลรวม+" เวลา:"+t);
} จับ (FileNotFoundException จ) {
// TODO บล็อก catch ที่สร้างขึ้นอัตโนมัติ
e.printStackTrace();
-
บัฟเฟอร์ MappedByteBuffer=null;
พยายาม {
buffer=new RandomAccessFile("/home/tobacco/test/res.txt", "rw").getChannel().map(FileChannel.MapMode.READ_WRITE, 0, 1253244);
ผลรวมเต็ม=0;
อินท์เอ็น;
ยาว t1=System.currentTimeMillis();
สำหรับ(int i=0;i<1253244;i++){
//n=0x000000ff&buffer.get(i);
//ผลรวม+=n;
-
ยาว t=System.currentTimeMillis()-t1;
System.out.println("ผลรวม:"+ผลรวม+" เวลา:"+t);
} จับ (FileNotFoundException จ) {
// TODO บล็อก catch ที่สร้างขึ้นอัตโนมัติ
e.printStackTrace();
} จับ (IOException จ) {
// TODO บล็อก catch ที่สร้างขึ้นอัตโนมัติ
e.printStackTrace();
-
-
-
ผลการทดสอบ:
คัดลอกรหัสรหัสดังต่อไปนี้:
ผลรวม:0 เวลา:1458
ผลรวม:0 เวลา:67
ผลรวม:0 เวลา:8
จะเห็นได้ว่าความเร็วจะดีขึ้นอย่างมากโดยการแมปไฟล์บางส่วนหรือทั้งหมดลงในหน่วยความจำเพื่อการอ่านและเขียน
เนื่องจากไฟล์ที่แมปหน่วยความจำจะแมปไฟล์ในหน่วยความจำภายนอกกับพื้นที่ต่อเนื่องในหน่วยความจำก่อน ซึ่งถือเป็นอาร์เรย์ไบต์ การดำเนินการอ่านและเขียนจะดำเนินการโดยตรงบนหน่วยความจำ จากนั้นจึงทำการแมปพื้นที่หน่วยความจำใหม่ หน่วยความจำภายนอก ซึ่งช่วยประหยัดเวลาในการอ่านและเขียนที่จัดเก็บข้อมูลภายนอกบ่อยครั้ง และลดเวลาในการอ่านและเขียนได้อย่างมาก