gpt4 book ai didi

java - 性能问题 - 在 java 的 unix box 中写入巨大的 csv 文件时花费太多时间,与 MYSQL DB 交互以对每条记录进行交叉检查

转载 作者:行者123 更新时间:2023-11-29 19:20:49 25 4
gpt4 key购买 nike

我的Java应用程序读取巨大的csv文件(大小约为6-7 mb,有50k到60k记录),在连接到mysql数据库之间对每条记录进行交叉检查(只有选择查询)并执行一些操作,写入tmp csv 文件中的所有记录。但这里的问题是这个过程大约需要 6-7 个小时来写入 tmp 文件?

示例代码 -

public static void updateTransactionCsvFiles(String inputFilePath , String existingFileName,File outputFolder,File archiveFolder,String tpName) throws IOException {

File inputFile = new File(inputFilePath);
Charset charset = Charset.forName("UTF-8");
BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream(inputFile), charset));
CSVReader reader = new CSVReader(in, '|','"');
List<String[]> csvBody = reader.readAll();

File newFile = new File("tmp.csv");
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(newFile), charset),32768);
CSVWriter writer = new CSVWriter(bw, '|',CSVWriter.NO_QUOTE_CHARACTER);

Connection connection = null;
try {
Class.forName("oracle.jdbc.driver.OracleDriver"); // JDBC Type4
connection = DriverManager.getConnection("jdbc:mysql://"+dbhostname+"/db",dbusername,dbpassword);
}catch(Exception e){
e.printStackTrace();
}
for(int row=0 ; row < csvBody.listSize; row++){
String eachRecord[]= csvBody.get(row);
String array[]= csvBody.get(row);
array = Arrays.copyOf(array, array.length + 1); //create new array from old array and allocate three more element
array[array.length - 1] = "brandName";
csvBody.remove(row);
csvBody.add(row, array);


String customerId = eachRecord[3];
List tpList = new ArrayList();
tpList.add("100");
StringBuilder builder = new StringBuilder();
for( int i = 0 ; i < tpList.size(); i++ ) {
builder.append("?,");
}

String query = "select customer_id from customer where client_id IN " +
"("
+ builder.deleteCharAt( builder.length() -1 ).toString() + ")"+" and customer_id = ? ";
PreparedStatement pstmt =connection.prepareStatement(query);
pstmt.setObject(index,customerId);
rs = pstmt.executeQuery();
String pid ="";
while(rs.next()){
pid=rs.getInt(3);
}

csvBody.get(row)[4] = pid;


pstmt =con.prepareStatement(""SELECT status, senttime, process_id FROM feed WHERE customer_id = ? and sent_time =(select MAX(senttime) FROM feeds WHERE customer_id = ? ) "");
pstmt.setObject(1,customerId);
pstmt.setObject(2,customerId);
rs = pstmt.executeQuery();
while(rs.next()){
feedstatus = rs.getString(1);
senttime = rs.getTimestamp(2);
processid =rs.getInt(3);
}
csvBody.get(row)[6] = feedstatus;
rs.close();
pstmt.close();
}

writer.writeAll(csvBody); // write all records in to the file.
writer.flush();
writer.close();
csvBody.clear();
csvBody = null;
reader.close();
}

最佳答案

我建议进行以下更改:

  • 无需一次读取文件的所有行并进行处理。相反,您可以逐行读取它,执行查询并将其写入文件。这正是 BufferedReader 的使用方式。
  • 您正在使用 csvBody.remove(row);csvBody.add(row, array); 这不是一个好的做法。我们不应该修改正在迭代的集合。
  • 您无需为每次迭代创建新的 PreparedStatement 对象。您可以在 for 循环之外声明它,并通过设置参数在每次迭代中执行它。
  • csvBody.clear(); 不是必需的,因为我们不会读取所有行。
  • 如果 client_id 列还没有索引,您可能需要添加索引。

下面是如何逐行读取巨大的 csv 文件的示例:

BufferedReader in = new BufferedReader(new InputStreamReader(new   FileInputStream(inputFile), charset));
CSVReader reader = new CSVReader(in, '|','"');

String [] nextLine;
while ((nextLine = reader.readNext()) != null) {
//Process line
}

关于java - 性能问题 - 在 java 的 unix box 中写入巨大的 csv 文件时花费太多时间,与 MYSQL DB 交互以对每条记录进行交叉检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42460034/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com