提高在java中将查询结果写入CSV的性能

Tam*_*Tam 1 java performance

我有以下代码执行查询并将其直接写入字符串缓冲区,然后将其转储到CSV文件.我需要写大量的记录(最多一百万).这适用于一百万条记录,对于一个大约200mb的文件大约需要半小时!在我看来好像很多时间,不确定这是否是最好的.即使它包括使用其他jar/db连接工具,请向我推荐更好的方法.

....
eventNamePrepared = con.prepareStatement(gettingStats + 
    filterOptionsRowNum + filterOptions);
ResultSet rs = eventNamePrepared.executeQuery(); 
int i=0;
try{
......
FileWriter fstream = new FileWriter(realPath + 
    "performanceCollectorDumpAll.csv");
BufferedWriter out = new BufferedWriter(fstream);
StringBuffer partialCSV = new StringBuffer();


while (rs.next()) { 
  i++;
  if (current_appl_id_col_display) 
      partialCSV.append(rs.getString("current_appl_id") + ",");
  if (event_name_col_display) 
      partialCSV.append(rs.getString("event_name") + ",");
  if (generic_method_name_col_display) 
      partialCSV.append(rs.getString("generic_method_name") + ",");
  ..... // 23 more columns to be copied same way to buffer
  partialCSV.append(" \r\n");
  // Writing to file after 10000 records to prevent partialCSV 
  // from going too big and consuming lots of memory
  if (i % 10000 == 0){
      out.append(partialCSV);
      partialCSV = new StringBuffer();
  }
}               
con.close();
out.append(partialCSV);
out.close();
Run Code Online (Sandbox Code Playgroud)

谢谢,

Jar*_*aus 6

只是写BufferedWriter直接而不是构建StringBuffer.

另请注意,您应该使用StringBuilder而不是StringBuffer...... StringBuffer具有内部锁定,这通常是不必要的.


Ste*_*eed 5

分析通常是了解为什么某些东西变慢的唯一确定方法.但是,在这个例子中,我会建议两件不为人知的事情:

  1. 直接写入缓冲的编写器,而不是使用StringBuilder创建自己的缓冲.
  2. 通过整数序数引用结果集中的列.解析列名时,某些驱动程序可能会很慢.