【问题标题】:Writing huge rows into a file将大行写入文件
【发布时间】:2014-06-19 19:14:22
【问题描述】:

我有一个庞大的结果集,比如说 100 万行。我通常使用以下 sn-p 将它们写入文件,而我总是内存不足。有没有什么有效的方法可以消除这个问题?

 PrintWriter writer = new PrintWriter(filename, "UTF-8");
 iteration -> { writer.println(a single string); }

 writer.close();

【问题讨论】:

  • 调查缓冲。这样一来,您只会消耗尽可能多的内存。
  • 打印后尝试冲洗写入器。
  • 不要一次完成整个文件。把它分成块。
  • @MaxMega close() 应该是 flush()。
  • 你真的是说整个结果都在一个(!)字符串(a String)中吗?

标签: java postgresql memory-leaks resultset printwriter


【解决方案1】:

既然你说的是ResultSet,我就认为这是来自数据库?首先,使用流式结果集。 MySQL 的 JDBC 驱动程序喜欢在内存中缓冲 所有 行,如果有 1M(或 1B)行,这可能是个问题。

如果您想要扩展,请以线程方式进行。让一个线程(生产者)从 ResultSet 读取行,另一个线程(消费者)将行写入文件。像 ArrayBlockingQueue 这样的东西非常适合这个。如果消费者跟不上生产者,就开始阻塞,等待消费者跟上。这种方法占用的内存更少,速度更快,因为您的 IO 是并行完成的。

【讨论】:

  • 顺便说一句,PostgreSQL 也是如此。您需要设置一个 fetchSize。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-02
  • 1970-01-01
  • 1970-01-01
  • 2012-10-12
  • 1970-01-01
  • 1970-01-01
  • 2013-03-02
相关资源
最近更新 更多