대형 파일을 처리 할 때 일반적인 파일을 사용하여 자주 읽기 및 쓰기 작업을 수행하기 위해 일반 FileInputStream 또는 RandomAccessFile을 사용하는 경우 자주 읽기 및 쓰기 외부 메모리로 인해 프로세스가 느려집니다. 다음은 비교 실험입니다.
패키지 테스트; import java.io.bufferedInputStream; import java.io.fileInputStream; import java.io.filenotfoundException; import java.io.ioexception; import java.io.randomaccessfile; java.nio.mappedBytebuffer import; import java.nio.channels.filechannel; public class test {public static void main (String [] args) {try {fileInputStream fis = new FileInputStream ( "/home/tobacco/test/res.txt"); int sum = 0; int n; long t1 = system.currenttimemillis (); try {while ((n = fis.read ())> = 0) {sum+= n; }} catch (ioexception e) {// todo 자동 생성 캐치 블록 e.printstacktrace (); } long t = System.CurrentTimeMillis () -T1; System.out.println ( "sum :"+sum+"time :"+t); } catch (filenotfoundException e) {// todo 자동 생성 캐치 블록 e.printstacktrace (); } try {fileInputStream fis = new FileInputStream ( "/home/tobacco/test/res.txt"); bufferedInputStream bis = 새로운 bufferedInputStream (FIS); int sum = 0; int n; long t1 = system.currenttimemillis (); try {while ((n = bis.read ())> = 0) {sum+= n; }} catch (ioexception e) {// todo 자동 생성 캐치 블록 e.printstacktrace (); } long t = System.CurrentTimeMillis () -T1; System.out.println ( "sum :"+sum+"time :"+t); } catch (filenotfoundException e) {// todo 자동 생성 캐치 블록 e.printstacktrace (); } mappedByTeBuffer buffer = null; {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); 합계+= n; } long t = System.CurrentTimeMillis () -T1; System.out.println ( "sum :"+sum+"time :"+t); } catch (filenotfoundException e) {// todo 자동 생성 캐치 블록 e.printstacktrace (); } catch (ioexception e) {// todo 자동 생성 캐치 블록 e.printstacktrace (); }}}테스트 파일은 크기 1253244 바이트 파일입니다. 테스트 결과 :
합 : 220152087 시간 : 1464
합 : 220152087 시간 : 72
합 : 220152087 시간 : 25
이는 데이터가 올바르게 읽히는 것을 의미합니다. 데이터 처리 부분을 삭제하십시오.
패키지 테스트; import java.io.bufferedInputStream; import java.io.fileInputStream; import java.io.filenotfoundException; import java.io.ioexception; import java.io.randomaccessfile; java.nio.mappedBytebuffer import; import java.nio.channels.filechannel; public class test {public static void main (String [] args) {try {fileInputStream fis = new FileInputStream ( "/home/tobacco/test/res.txt"); int sum = 0; int n; long t1 = system.currenttimemillis (); try {while ((n = fis.read ())> = 0) {// sum+= n; }} catch (ioexception e) {// todo 자동 생성 캐치 블록 e.printstacktrace (); } long t = System.CurrentTimeMillis () -T1; System.out.println ( "sum :"+sum+"time :"+t); } catch (filenotfoundException e) {// todo 자동 생성 캐치 블록 e.printstacktrace (); } try {fileInputStream fis = new FileInputStream ( "/home/tobacco/test/res.txt"); bufferedInputStream bis = 새로운 bufferedInputStream (FIS); int sum = 0; int n; long t1 = system.currenttimemillis (); try {while ((n = bis.read ())> = 0) {// sum+= n; }} catch (ioexception e) {// todo 자동 생성 캐치 블록 e.printstacktrace (); } long t = System.CurrentTimeMillis () -T1; System.out.println ( "sum :"+sum+"time :"+t); } catch (filenotfoundException e) {// todo 자동 생성 캐치 블록 e.printstacktrace (); } mappedByTeBuffer buffer = null; {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 자동 생성 캐치 블록 e.printstacktrace (); } catch (ioexception e) {// todo 자동 생성 캐치 블록 e.printstacktrace (); }}}테스트 결과 :
합 : 0 시간 : 1458
합 : 0 시간 : 67
합 : 0 시간 : 8
읽기 및 쓰기를 위해 일부 또는 모든 파일을 메모리에 매핑 한 후 속도가 훨씬 높아질 것임을 알 수 있습니다.
메모리 매핑 된 파일은 먼저 외부 메모리의 파일을 메모리의 연속 영역에 맵핑하고 바이트 배열로 처리되기 때문입니다. 읽기 및 쓰기 작업은 메모리에서 직접 작동 한 다음 메모리 영역을 외부 메모리 파일로 다시 비추어 중간에 외부 메모리를 자주 읽고 쓰는 시간을 절약하여 읽기 및 쓰기 시간을 크게 줄입니다.
Java에서 메모리 매핑을 사용하여 큰 파일을 처리하기위한 위의 구현 코드는 내가 공유 한 모든 컨텐츠입니다. 나는 당신이 당신에게 참조를 줄 수 있기를 바랍니다. 그리고 당신이 wulin.com을 더 지원할 수 있기를 바랍니다.