csv的数据格式。
一个文件好几百兆,1个文件大概200万行左右的数据,现在我要解决的问题是,将 csv的数据读出来,组合数据,生成sql文件。
以前单线程跑,跑了一下午才完成,大概跑了几个小时。多线程跑,大概2-3分钟左右,200万条数据,包括过滤。
这个场景在平常开发中也是经常要用到的。发出来,希望大家能够指导学习~
优化版地址:
package test.com.linapex.room;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.File;import java.io.FileOutputStream;import java.io.FileReader;import java.io.OutputStreamWriter;import java.util.ArrayList;import java.util.Arrays;import java.util.List;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.Future;import java.util.concurrent.locks.ReentrantReadWriteLock;import java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock;import com.linapex.common.util.FileUtils;import com.linapex.common.util.ZhengzeValidate;public class TBuilderRoomSqlFileTool{ final static int DATACACHENUM = 10000; static int currThreadCount = 0; static int maxThreadCount = 10; static File roomFilterLogFile = new File("roomFilter.log"); static File sqlFile = new File("roomSql.sql"); static File csvFile = new File("D:\\baiduyundownload\\asd\\2000W\\1-200W.csv"); final static String sqlStrTemplate = "INSERT INTO `t_room_record`(id,name, card, gender, birthday, address, zip, mobile, email, version) VALUES (null,':0', ':1', ':2', ':3', ':4', ':5', ':6', ':7',':8');"; public static BufferedWriter initSQLWrite() throws Exception { if (sqlFile.exists()) { sqlFile.delete(); if (!sqlFile.createNewFile()) { System.err.println("创建文件失败:" + sqlFile.getAbsolutePath()); } } return new BufferedWriter(new OutputStreamWriter(new FileOutputStream(sqlFile, true), "UTF-8")); } public static void loadCSV(CallBack2 callBack) throws Exception { BufferedReader reader = null; try { reader = new BufferedReader(new FileReader(csvFile)); String str = null; int num = 0; while ((str = reader.readLine()) != null) { num++; callBack.call(num, str); } } finally { reader.close(); } } public static void main(String[] args) throws Exception { final ExecutorService threadPool = Executors.newFixedThreadPool(maxThreadCount); final List
如果需要测试代码的朋友,请修改
1、FileUtils.doWriteFile 改成 System.out 输出
2、将数据过滤去掉即可。
输出的日志,经过优化,代码效率从2-3分钟提高了1分钟多点:
pool-1-thread-8,准备消费 需要保存数据的集合长度:0pool-1-thread-8,消费完成,耗费时间:0 ms,消费数据长度:0已回调线程数:8已回调线程数:9pool-1-thread-9,准备消费 需要保存数据的集合长度:0pool-1-thread-9,消费完成,耗费时间:0 ms,消费数据长度:0已回调线程数:10重新开始提交线程 当前线程数:0 允许最大线程数:10 等待线程完成回调.pool-1-thread-10,准备消费 需要保存数据的集合长度:4pool-1-thread-10,消费完成,耗费时间:0 ms,消费数据长度:4flush线程:main, 需要保存数据的集合长度:9102flush线程:main, 消费完成,消费数据长度:9102任务完成时间:104797 ms
不允许转载~~~只能看,不能摸/偷笑