【问题标题】:Dynamically writing to CSV during loop在循环期间动态写入 CSV
【发布时间】:2013-10-29 18:23:06
【问题描述】:

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

}

【问题讨论】:

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


    【解决方案1】:

    Map the file 到内存并使用MemoryMappedBuffer。你不会打败操作系统(很可能)。 Guava 为此提供了方便的shortcut

    【讨论】:

    • 那么你是说它正在当前将*allints 存储到内存中,直到我调用close()
    • 它允许您像使用内存缓冲区一样使用文件。它会自动刷新它(或者你可以调用 buffer.force() 如果强制它,在这里讨论:stackoverflow.com/questions/4096881/…
    • 或许你可以举个例子?
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-19
      • 2016-09-30
      • 1970-01-01
      • 1970-01-01
      • 2018-01-19
      • 1970-01-01
      • 1970-01-01
      • 2021-01-22
      相关资源
      最近更新 更多