大数据量csv文件导入数据库

  今天客户拿过来一个500多M的csv文件(汗,中国移动导的欠费记录,导出的人也是强人),用Excel直接打开只能看到100多万条记录,超过部分就看不到了。 让我们想想办法,看能不能拆分成多个excel表格。想了很多办法,用PL/sql导入数据库后再分,直接死机了。最后想到了写代码导入。代码如下:

String filePath = "D:/aa2.csv";
		File file = new File(filePath);
		if (file.exists()) {
			int i = 0;
			String strLine = null;
			Statement ps = null;
			Connection conn = null;
			String sql = null;
			try{
				conn = HibernateSessionUtil.getConnection();
				conn.setAutoCommit(false);
				ps = conn.createStatement();
				BufferedReader bufferedreader = new BufferedReader(new FileReader(filePath));
				while ((strLine = bufferedreader.readLine()) != null) {
					i++;
					String [] values = strLine.split(",");//逗号隔开的各个列
					String cell0 = values[0];
					String cell1 = values[1];
					String cell2 = values[2];
					String cell3 = values[3];
					String cell4 = values[4];
					String cell5 = values[5];
					String cell6 = values[6];
					String cell7 = values[7];	
					sql = String.format("INSERT INTO TBLDATA2(CELL0,CELL1,CELL2,CELL3,CELL4,CELL5,CELL6,CELL7,TID) VALUES ('%s','%s','%s','%s','%s','%s','%s','%s',SEQ_TBLID.NEXTVAL)",
							cell0,cell1,cell2,cell3,cell4,cell5,cell6,cell7);
					ps.executeUpdate(sql);
					if(i%500 == 0){
						//500条记录提交一次
						conn.commit();
						System.out.println("已成功提交"+i+"行!");
					}
				}
				if(i%500 != 0){
					//不够500条的再提交一次(其实不用判断,直接提交就可以,不会重复提交的)
					conn.commit();
					System.out.println("已成功提交"+i+"行!");
				}
				
			}catch(Exception ex){
				System.out.println("导出第"+(i+1)+"条时出错,数据是" + strLine);
				System.out.println("出错的sql语句是:" + sql);
				System.out.println("错误信息:");
				ex.printStackTrace();
				try {
					if (conn != null) {
						conn.rollback();
					}
				} catch (Exception e) {
					e.printStackTrace();
				}
			} finally{
				try {
					if (ps != null) {
						ps.close();
					}
				} catch (Exception ex) {
					ex.printStackTrace();
				}
				try {
					if (conn != null){
						conn.close();
					}
				} catch (Exception ex) {
					ex.printStackTrace();
				}
		    }
		}


 

最后导了两个多小时,700多万条数据。
导入到数据库就好办了,50万或者100万导成一个excel表都可以。

### 如何高效地将大型 CSV 文件导入数据库 #### 方法一:分批处理与多线程技术 对于非常大的CSV文件,一次性加载整个文件可能会消耗大量内存并导致性能下降。采用分批次读取的方式能够有效缓解这一问题。例如,在Python中利用`pandas`库时可以通过设置参数来控制每次读入的数据量[^1]。 ```python chunksize = 10 ** 6 for chunk in pd.read_csv('data.csv', chunksize=chunksize): process(chunk) # 对每一块数据进行必要的转换或清理工作 ``` 这种方法不仅减少了单次操作所需的资源开销,还允许并发或多线程执行多个批次的任务,从而加快整体速度。 #### 方法二:使用专用工具和插件 一些专门用于处理大规模数据集的工具提供了更高效的解决方案。比如Django生态系统的`django-csvimport`插件就支持直接在Web界面上完成CSV文件向关系型数据库表结构映射的过程,并且可以方便地集成其他辅助模块来进行额外的数据验证等工作[^4]。 另外还有像MySQL Workbench这样的图形化客户端软件也具备强大的批量导入特性;而对于那些追求更高灵活性的应用场景,则可以选择基于JavaScript/React构建的第三方组件——CSV Importer,它能够在浏览器端快速解析本地存储的大尺寸表格文档后再提交给服务器侧做持久化保存[^2]。 #### 方法三:优化数据库配置与索引策略 当面对海量记录时,适当调整目标RDBMS实例的相关参数同样重要。这可能涉及到增大缓冲池大小、修改事务日志位置等措施以适应高吞吐率的需求。与此同时,创建合适的唯一键、外键约束以及聚集/非聚集索引来加速查询响应时间也是不可忽视的一环。 最后值得注意的是,在实际部署之前务必先在一个测试环境中充分评估所选方案的效果,确保其满足业务层面的各项指标要求之后再推广至生产环境当中去。
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值