我有一个方法可以将44 MB的数据从ResultSet写入CSV文件。但是,大约需要3.5分钟才能完成。这似乎只有44 MB的数据缓慢。任何人都可以看到任何放缓我的代码?:Slow BufferedWriter性能
public static void convertToCSV(final ResultSet rs) throws SQLException, IOException {
final BufferedWriter fw = new BufferedWriter(new FileWriter(new File("alert.csv")));
while (rs.next()) {
fw.write(rs.getString("FIELD1")+",");
fw.write(rs.getString("FIELD2")+",");
fw.write(rs.getString("FIELD3")+",");
final String clobValue = rs.getString("FIELD4");
if(clobValue==null)
fw.write("null,");
else{
fw.write("\""+clobValue+"\",");
}
final Date date = new Date(rs.getLong("FIELD5"));
final DateFormat format = new SimpleDateFormat("yyyyMMdd HH:mm:ss");
format.setTimeZone(TimeZone.getTimeZone("Etc/UTC"));
final String dateTime[] = format.format(date).split(" ");
fw.write(dateTime[0]+",");
fw.write(dateTime[1]);
fw.write("\n");
}
fw.close();
}
增加获取ResultSet的语句上的获取大小可能会有所帮助 - 默认情况下,它会返回到数据库以每10行获取更多数据。权衡是如果您增加获取大小,您也会增加内存占用量。 – JonK
它是否真的很慢,涉及到很多JDBC代码,您正在执行大量的String concats,这些String concats会生成大量需要gc'd的字符串。虽然日期格式不是线程安全的,但我只会在此方法内构建它并重用。并且可能使用'StringBuilder'来创建一个字符串并一次写入。 –
如果您没有写入任何数据,您是否测量了时间并将SimpleDateFormat移出循环? –