【问题标题】:Java PrintWriter big memory consumeJava PrintWriter 大内存消耗
【发布时间】:2018-04-27 19:11:25
【问题描述】:

我正在尝试从 DB 中写一个大文件文本,大约 2 百万行。 我观察到当 PrintWriter 正在打印 (println()) 行时,文件大小始终为 0 字节。流关闭后文件具有大小数据。 它导致所有数据首先保存在内存中,并在流关闭时释放它。 就我而言,在消耗了 1 百万数据 +- 2.5GB 内存之后。应用程序崩溃。 是否可以实时写入数据并防止内存消耗?

这是一个例子:

    File file = new File("file.txt");

   PrintWriter out;

   out = new PrintWriter(new OutputStreamWriter(new BufferedOutputStream(new FileOutputStream(file)), "UTF-8"));

for (int i=0; i < 9999999; i++){
    out.println("some data here");
}
out.close();

【问题讨论】:

  • 为什么要让 PrintWriter 创建复杂化?您可以只使用 new PrintWriter("file.txt");要回答您的问题,请尝试每 'n' 行使用一次 flush()。

标签: java printwriter


【解决方案1】:

您创建了 PrintWriter 没有自动行刷新,因此内容将被缓冲,直到您调用 flush()close()。由于您不想刷新每一行(它很慢),因此您可以每隔N 行执行一次刷新

for (int i=0; i < 9999999; i++){
    out.println("some data here");
    if(i % N == 0)
        out.flush();
}

N 的不同值尝试一下,看看性能如何变化。

【讨论】:

  • 您好 Kayaman,我尝试使用 out.flush() 但不适合我。我也尝试使用构造函数启用自动刷新:out = new PrintWriter(new OutputStreamWriter(new BufferedOutputStream(new FileOutputStream(file)), "UTF-8"), true);
  • “它不工作”是什么意思?您可以看到文件大小随着数据的刷新而增长。
  • 文件大小始终为 0 字节,内存最大为 2.5GB。只有在 out.close() 执行时才有数据大小。
  • 那你不会打电话给flush()。你可能认为你是,但如果字节没有被刷新到文件中,你就没有调用它。
  • flush()调用正常,但结果是一样的。
猜你喜欢
  • 2015-04-04
  • 1970-01-01
  • 2022-01-16
  • 2014-01-04
  • 2012-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多