เมื่อประมวลผลไฟล์ขนาดใหญ่หากคุณใช้ 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; การทดสอบคลาสสาธารณะ {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {ลอง {fileInputStream fis = ใหม่ FileInputStream ("/home/tobacco/test/res.txt"); int sum = 0; int n; t1 ยาว = system.currenttimeMillis (); ลอง {ในขณะที่ ((n = fis.read ())> = 0) {sum+= n; }} catch (ioexception e) {// toDo บล็อก catch block ที่สร้างขึ้นอัตโนมัติ e.printstacktrace (); } long t = system.currentTimeMillis ()-t1; System.out.println ("sum:"+sum+"เวลา:"+t); } catch (filenotfoundexception e) {// todo บล็อก catch block ที่สร้างขึ้นอัตโนมัติ e.printstacktrace (); } ลอง {fileInputStream fis = new FileInputStream ("/home/tobacco/test/res.txt"); bufferedInputStream bis = ใหม่ bufferedInputStream (FIS); int sum = 0; int n; t1 ยาว = system.currenttimeMillis (); ลอง {ในขณะที่ ((n = bis.read ())> = 0) {sum+= n; }} catch (ioexception e) {// toDo บล็อก catch block ที่สร้างขึ้นอัตโนมัติ e.printstacktrace (); } long t = system.currentTimeMillis ()-t1; System.out.println ("sum:"+sum+"เวลา:"+t); } catch (filenotfoundexception e) {// todo บล็อก catch block ที่สร้างขึ้นอัตโนมัติ e.printstacktrace (); } buffer mappedByTebuffer = null; ลอง {buffer = new randomActEcessFile ("/home/tobacco/test/res.txt", "rw"). getChannel (). MAP (FileChannel.MapMode.Read_Write, 0, 1253244); int sum = 0; int n; t1 ยาว = system.currenttimeMillis (); สำหรับ (int i = 0; i <1253244; i ++) {n = 0x000000ff & buffer.get (i); sum+= n; } long t = system.currentTimeMillis ()-t1; System.out.println ("sum:"+sum+"เวลา:"+t); } catch (filenotfoundexception e) {// todo บล็อก catch block ที่สร้างขึ้นอัตโนมัติ e.printstacktrace (); } catch (ioexception e) {// todo บล็อก catch block ที่สร้างอัตโนมัติ 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; การทดสอบคลาสสาธารณะ {โมฆะคงที่สาธารณะหลัก (สตริง [] args) {ลอง {fileInputStream fis = ใหม่ FileInputStream ("/home/tobacco/test/res.txt"); int sum = 0; int n; t1 ยาว = system.currenttimeMillis (); ลอง {ในขณะที่ ((n = fis.read ())> = 0) {// sum+= n; }} catch (ioexception e) {// toDo บล็อก catch block ที่สร้างขึ้นอัตโนมัติ e.printstacktrace (); } long t = system.currentTimeMillis ()-t1; System.out.println ("sum:"+sum+"เวลา:"+t); } catch (filenotfoundexception e) {// todo บล็อก catch block ที่สร้างขึ้นอัตโนมัติ e.printstacktrace (); } ลอง {fileInputStream fis = new FileInputStream ("/home/tobacco/test/res.txt"); bufferedInputStream bis = ใหม่ bufferedInputStream (FIS); int sum = 0; int n; t1 ยาว = system.currenttimeMillis (); ลอง {ในขณะที่ ((n = bis.read ())> = 0) {// sum+= n; }} catch (ioexception e) {// toDo บล็อก catch block ที่สร้างขึ้นอัตโนมัติ e.printstacktrace (); } long t = system.currentTimeMillis ()-t1; System.out.println ("sum:"+sum+"เวลา:"+t); } catch (filenotfoundexception e) {// todo บล็อก catch block ที่สร้างขึ้นอัตโนมัติ e.printstacktrace (); } buffer mappedByTebuffer = null; ลอง {buffer = new randomActEcessFile ("/home/tobacco/test/res.txt", "rw"). getChannel (). MAP (FileChannel.MapMode.Read_Write, 0, 1253244); int sum = 0; int n; t1 ยาว = system.currenttimeMillis (); สำหรับ (int i = 0; i <1253244; i ++) {//n=0x000000ff&buffer.get(i); // sum+= n; } long t = system.currentTimeMillis ()-t1; System.out.println ("sum:"+sum+"เวลา:"+t); } catch (filenotfoundexception e) {// todo บล็อก catch block ที่สร้างขึ้นอัตโนมัติ e.printstacktrace (); } catch (ioexception e) {// todo บล็อก catch block ที่สร้างอัตโนมัติ e.printstacktrace (); -ผลการทดสอบ:
ผลรวม: 0 เวลา: 1458
ผลรวม: 0 เวลา: 67
ผลรวม: 0 เวลา: 8
จะเห็นได้ว่าหลังจากการแมปไฟล์บางส่วนหรือทั้งหมดไปยังหน่วยความจำสำหรับการอ่านและการเขียนความเร็วจะสูงขึ้นมาก
นี่เป็นเพราะไฟล์ที่แมปหน่วยความจำแมปแรกแมปไฟล์บนหน่วยความจำภายนอกไปยังพื้นที่ต่อเนื่องในหน่วยความจำและถูกประมวลผลเป็นอาร์เรย์ไบต์ การดำเนินการอ่านและเขียนทำงานโดยตรงบนหน่วยความจำจากนั้นรีแมปพื้นที่หน่วยความจำไปยังไฟล์หน่วยความจำภายนอกซึ่งจะช่วยประหยัดเวลาสำหรับการอ่านและการเขียนหน่วยความจำภายนอกบ่อยครั้งตรงกลางลดเวลาอ่านและเขียนอย่างมาก
รหัสการใช้งานด้านบนสำหรับการประมวลผลไฟล์ขนาดใหญ่โดยใช้การแมปหน่วยความจำใน Java เป็นเนื้อหาทั้งหมดที่ฉันได้แชร์กับคุณ ฉันหวังว่าคุณจะให้ข้อมูลอ้างอิงและฉันหวังว่าคุณจะสนับสนุน wulin.com มากขึ้น