fireinjava
2010-07-22 14:40 阅读 510
已采纳

大数据量写文件 Java heap space

[code="java"]
Statement stmt = ds.getConnection().createStatement();
stmt.setFetchSize(2000);
ResultSet rs = stmt.executeQuery(sqlQuery);
pw = new PrintWriter(new FileWriter(fileW, true));
StringBuilder dataStr2 = new StringBuilder("");
int c=0;
for (; rs.next(); pw.print(dataStr2.append("\r\n").toString())) {
dataStr2 = new StringBuilder("");
for (int i = 1; i <= 8; i++)
dataStr2.append(rs.getString(i));
if (c++ % 2000 == 0)
pw.flush();
}
[/code]
请问数据量上百万的,以上代码怎么优化!

广告离我远点 -_#

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

2条回答 默认 最新

  • 已采纳
    yingxiongtnt yingxiongtnt 2010-07-30 20:25

    大致修改了下,如果还是很慢,建议你研究下你的SQL,因为写文件是耗不了多少时间的

    [code="java"]Statement stmt = ds.getConnection().createStatement();

    stmt.setFetchSize(2000);

    ResultSet rs = stmt.executeQuery(sqlQuery);

    pw = new PrintWriter(new FileWriter(fileW, true));

    StringBuilder dataStr2 = new StringBuilder("");

    int c=0;

    for (; rs.next(); ) {

    dataStr2 = dataStr2.delete(0, dataStr2.length()); // 避免构造大量对象实例
    for (int i = 1; i <= 8; i++)

    dataStr2.append(rs.getString(i));

    if (c++ % 2000 == 0) {
    pw.flush();
    // 200条数据写一次,没必要没读一条写一次
    pw.print(dataStr2.append("\r\n").toString())) ;

    }
    }[/code]

    点赞 评论 复制链接分享
  • wwty1314 wwty1314 2010-07-28 15:40

    可以利用生产者消费者模式,声明一个同步的集合,然后一个负责生产,一个负责写入,当然写入的规则可以根据实际情况来实现;这样的话,得需要两个线程,当前的一个线程是生产的,然后另一个线程监控同步集合负责消费。

    点赞 评论 复制链接分享

相关推荐