0

で巨大なループを扱っていstatic void main(String[] args)ます。このループは、CSV に取得したいいくつかの数値プリミティブを操作します。CSV の各行は、ループの反復に対応します。

私の目的は、これらのプリミティブを動的に記述して、各反復の最後にガベージ コレクションを実行し、本質的に忘れられるようにすることです。ループが非常に長いため、最悪の事態は、ループの最後までこれらをメモリに格納しておくことです。

これを実行しようとするクラスを作成しました。これを以下に貼り付けます。質問: CSV の各行はメモリに保存され、ループの最後にディスクに書き込まれますか? もしそうなら、メモリを解放するためにループの繰り返しごとにディスクへの書き込みが行われるようにするにはどうすればよいでしょうか (できれば高速な方法で)。

public static void main(String[] args) throws Exception {
    WriteCSV csvWriter = new WriteCSV("src","Hello.csv")

    for(int i = 0 ; i < 1000 ; ++i) { //Much bigger in real-world case
        csvWriter.writeRow(i);
    }
    csvWriter.close(); //Does all i between {1,2,...,1000} get GC'd here or dynamically in the above loop???
}

ループで動的に書き込む CSV 書き込みクラス:

class WriteCSV {
    private FileWriter fstream;
    private BufferedWriter out;


    public WriteCSV(String directory, String filename) throws IOException {     
        File file = new File(directory, filename);

        this.fstream = new FileWriter(file);
        this.out = new BufferedWriter(this.fstream);
    }


    public void writeRow(int newRow) throws IOException {
        this.out.write(String.valueOf(newRow));
        this.out.newLine();
    }

    public void close() throws IOException {
        this.out.close();
    }

}
4

2 に答える 2

1

ファイルをメモリにマップし、MemoryMappedBufferを使用します。OS に勝るものはありません (おそらく)。Guava には、このための便利なショートカットがあります。

于 2013-10-21T10:07:33.433 に答える
0

BufferedWriterを使用しているため、ループの最後にファイルに書き込めない場合があります。これは、データのサイズによって異なります。BufferedWriter は、ファイルに書き込むためのデフォルト サイズとして 8192 を使用します。つまり、ライターによってキャッシュされるデータ サイズが最大 8192 でない限り、ファイルに書き込みません。

于 2013-10-21T10:27:29.637 に答える