在循环期间动态写入CSV

时间:2013-10-21 10:02:24

标签: java csv memory-management io garbage-collection

我正在使用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();
    }

}

2 个答案:

答案 0 :(得分:1)

Map the file到内存并使用MemoryMappedBuffer。你不会打败操作系统(最有可能)。番石榴有一个方便的shortcut

答案 1 :(得分:0)

当您使用BufferedWriter时,它可能无法在循环结束时写入文件。这取决于您的数据大小。 BufferedWriter使用8192作为默认大小来写入文件,这意味着除非编写器缓存的数据大小达到8192,否则它不会写入文件。