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。你不会打败操作系统(很可能)。Guava 有一个方便的快捷方式

于 2013-10-21T10:07:33.433 回答
0

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

于 2013-10-21T10:27:29.637 回答