我正在使用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();
}
}
答案 0 :(得分:1)
Map the file到内存并使用MemoryMappedBuffer。你不会打败操作系统(最有可能)。番石榴有一个方便的shortcut。
答案 1 :(得分:0)
当您使用BufferedWriter时,它可能无法在循环结束时写入文件。这取决于您的数据大小。 BufferedWriter使用8192作为默认大小来写入文件,这意味着除非编写器缓存的数据大小达到8192,否则它不会写入文件。