5

テキストファイルとの間で大量の読み取りと書き込みを行うJavaコードを実行します。プログラムソースは非常に単純で、ループ内でテストファイルに2000行を書き込み、それからそれらを再度読み取って、ディスクへの大量の読み取りと書き込みを生成します。しかし、プログラムが実行されているとき、「iostat -d -x1」でディスクを監視します。2番目の「r/s」の読み取りに変化はないことがわかりましたが、「w/s」は予想どおりに増加しました!!! これは、iostatコマンドの出力例です。

Device: rrqm/s wrqm/s  r/s   w/s    rsec/s wsec/s   avgrq-sz avgqu-sz await svctm  %util
sda     0.00   913.00  0.00  82.00  0.00   7872.00   96.00    0.58    7.09   7.11  58.30

Device: rrqm/s wrqm/s  r/s   w/s   rsec/s  wsec/s  avgrq-sz  avgqu-sz  await  svctm  %util
sda     0.00   869.00  0.00  79.00  0.00   7584.00    96.00   0.57    7.11   7.18  56.70

Device: rrqm/s wrqm/s  r/s   w/s   rsec/s  wsec/s  avgrq-sz avgqu-sz   await  svctm  %util
sda     0.00   847.00  0.00  77.00  0.00   7392.00   96.00   0.57      7.42   7.43  57.20

Device: rrqm/s wrqm/s  r/s   w/s   rsec/s  wsec/s   avgrq-sz avgqu-sz  await  svctm  %util
sda     0.00  1221.00  0.00  113.00  0.00  10760.00  95.22    0.84     7.47   7.32  82.70

示されているように、すべての「r / s」はゼロです!しかし、Javaプログラムでは、ファイルに書き込んだ分だけ読み取りますか?!Javaコードを実行すると、1秒あたりの書き込み回数が増えますが、「r/s」に変化はありません!! ディスクを監視するときに実行するJavaコードは次のとおりです。

import java.io.*;

public class Test {

    public static void main(String [] args) throws IOException{

    String fileName = "/scratch/dump_file.txt";
    File f = new File(fileName);
    // Attempt to delete it
    boolean success = f.delete();
    int j=0;
    while(j<20000)
    {
        ++j;
        Writer output = null;
        String text = "A test content";
        File file = new File(fileName);
        output = new BufferedWriter(new FileWriter(file));

        int i=1;
        while(i<2000)
        {
            //Here we start writing 2000 lines into file line by line
            output.write("j==="+Integer.toString(j)+text+Integer.toString(i)+"\n");
            ++i;
        }
        output.close();
        System.out.println("Your file has been written");  

        String line = null;
        try {
            // FileReader reads text files in the default encoding.
            FileReader fileReader = new FileReader(fileName);
            BufferedReader bufferedReader = 
            new BufferedReader(fileReader);
            i=1;
            while((line = bufferedReader.readLine()) != null) {
                //Here we start reading from file line by line and show the result on screen
                ++i;
                System.out.println(line);
            }   
            // Always close file
            bufferedReader.close();         
        }
        catch(FileNotFoundException ex) {
            System.out.println(
                "Unable to open file '" + 
                fileName + "'");                
        }
        catch(IOException ex) {
            System.out.println(
                "Error reading file '" 
                + fileName + "'");                  
            // Or we could just do this: 
            // ex.printStackTrace();
        }
    }
}
}
4

1 に答える 1

6

ほとんどの場合、オペレーティングシステムはファイルをRAMにキャッシュしています。すでにメモリにキャッシュされているため、Javaで読み取る場合、OSは実際にディスクから読み取る必要はありません。OSは、すでにキャッシュされているコピーを提供するだけです。これは、実際にディスクから読み取るよりもはるかに高速です。ただし、実際のディスクの読み取りと書き込みiostatのみを報告するため、キャッシュされた読み取りはそこに表示されないことに注意してください。

于 2012-10-07T19:30:24.783 に答える