大きなファイルを処理する場合、通常のFileInputStream、FileOutputStream、またはRandomAccessFileを使用して頻繁に読み取りおよび書き込み操作を実行すると、外部メモリが頻繁に読み取られて書き込むため、プロセスが遅くなります。以下は比較実験です。
パッケージテスト; java.io.bufferedinputStreamをインポートします。 java.io.fileinputStreamをインポートします。 java.io.filenotfoundexceptionをインポートします。 java.io.ioexceptionをインポートします。 java.io.randomaccessfileをインポートします。 java.nio.mappybytebufferをインポートします。 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){// dodo auto-enerated catch block e.printstacktrace(); } long t = system.currenttimemillis() - t1; System.out.println( "sum:"+sum+"time:"+t); } catch(filenotfoundexception e){// dodo auto-enerated catch block e.printstacktrace(); } try {fileInputStream fis = new fileInputStream( "/home/tobacco/test/res.txt"); BufferedInputStream bis = new BufferedInputStream(FIS); int sum = 0; int n; long t1 = system.currenttimemillis(); try {while((n = bis.read())> = 0){sum+= n; }} catch(ioException e){// dodo auto-enerated catch block e.printstacktrace(); } long t = system.currenttimemillis() - t1; System.out.println( "sum:"+sum+"time:"+t); } catch(filenotfoundexception e){// dodo auto-enerated catch block e.printstacktrace(); } mappedbytebuffer buffer = null; try {buffer = new RandomAccessFile( "/home/tobacco/test/res.txt"、 "rw")。getChannel()。map(felechannel.mapmode.read_write、0、1253244); int sum = 0; int n; long t1 = system.currenttimemillis(); for(int i = 0; i <1253244; i ++){n = 0x0000fff&buffer.get(i); sum+= n; } long t = system.currenttimemillis() - t1; System.out.println( "sum:"+sum+"time:"+t); } catch(filenotfoundexception e){// dodo auto-enerated catch block e.printstacktrace(); } catch(ioException e){// todo auto-fenated 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.mappybytebufferをインポートします。 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){// dodo auto-enerated catch block e.printstacktrace(); } long t = system.currenttimemillis() - t1; System.out.println( "sum:"+sum+"time:"+t); } catch(filenotfoundexception e){// dodo auto-enerated catch block e.printstacktrace(); } try {fileInputStream fis = new fileInputStream( "/home/tobacco/test/res.txt"); BufferedInputStream bis = new BufferedInputStream(FIS); int sum = 0; int n; long t1 = system.currenttimemillis(); try {while((n = bis.read())> = 0){// sum+= n; }} catch(ioException e){// dodo auto-enerated catch block e.printstacktrace(); } long t = system.currenttimemillis() - t1; System.out.println( "sum:"+sum+"time:"+t); } catch(filenotfoundexception e){// dodo auto-enerated catch block e.printstacktrace(); } mappedbytebuffer buffer = null; try {buffer = new RandomAccessFile( "/home/tobacco/test/res.txt"、 "rw")。getChannel()。map(felechannel.mapmode.read_write、0、1253244); int sum = 0; int n; long t1 = system.currenttimemillis(); for(int i = 0; i <1253244; i ++){//n = 0x000000FFF&buffer.get(i); // sum+= n; } long t = system.currenttimemillis() - t1; System.out.println( "sum:"+sum+"time:"+t); } catch(filenotfoundexception e){// dodo auto-enerated catch block e.printstacktrace(); } catch(ioException e){// todo auto-fenated catch block e.printstacktrace(); }}}テスト結果:
合計:0時間:1458
合計:0時間:67
合計:0時間:8
読み書きのためにファイルの一部またはすべてをメモリにマッピングした後、速度がはるかに高くなることがわかります。
これは、メモリマッピングされたファイルが最初に外部メモリ上のファイルをメモリ内の連続領域にマップし、バイト配列として処理されるためです。読み取り操作はメモリ上で直接動作し、メモリ領域を外部メモリファイルに再マップします。これにより、中央で外部メモリの頻繁な読み取りと書き込みの時間が節約され、読み取り時間と書き込み時間が大幅に短縮されます。
Javaでメモリマッピングを使用して大ファイルを処理するための上記の実装コードは、私があなたと共有したすべてのコンテンツです。参照を提供できることを願っています。wulin.comをもっとサポートできることを願っています。