文档章节

解问题系列:大文件分割

lifereader
 lifereader
发布于 2017/08/15 23:36
字数 344
阅读 3
收藏 0

最近公司数据从postgre迁移到mysql,其中一张表时近500w行数据,文件大小近2G,测试时一次插入数据库太慢,所以想试试小文件时插入的速度如何,于是想把大文件拆分成小文件。假设40w条一个文件,拆分后近12个文件。

两种代码如下:第一种使用java常用的读写文件方式,运行时速度很慢,花费10分钟了还没完,

public static void spliter(String fileName, String outputPath) throws IOException {

		int totalLine = 0;

		try (RandomAccessFile randomFile = new RandomAccessFile(new File(fileName), "r")) {

			int fileIndex = 0;
			BufferedWriter writer = createFile(fileIndex, outputPath);
			String sqlLine = null;
			while ((sqlLine = randomFile.readLine()) != null) {

				totalLine++;
				sqlLine = new String(sqlLine.getBytes("ISO-8859-1"), "utf-8");

				writer.write(sqlLine);
				writer.newLine();
				if (totalLine % EVERY_NUM == 0) {
					writer.close();
					fileIndex++;
					writer = createFile(fileIndex, outputPath);
				}
			}
			writer.close();
		}

	}

	private static BufferedWriter createFile(int index, String outputPath) throws IOException {
		String name = outputPath + "item_sub_" + index + ".sql";
		File writeFile = new File(name);
		return new BufferedWriter(new OutputStreamWriter(new FileOutputStream(writeFile), "UTF-8"));
	}

第二次优化代码使用流的方式,不到1分钟便拆分完成。

public static void spliter(String fileName, String outputPath) throws IOException {

		int totalLine = 0;

		try (FileInputStream inputStream = new FileInputStream(fileName)) {
			try (Scanner sc = new Scanner(inputStream, "UTF-8")) {

				int fileIndex = 0;
				BufferedWriter writer = createFile(fileIndex, outputPath);

				while (sc.hasNextLine()) {
					String sqlLine = sc.nextLine();
					totalLine++;
					writer.write(sqlLine);
					writer.newLine();
					if (totalLine % EVERY_NUM == 0) {
						writer.close();
						fileIndex++;
						writer = createFile(fileIndex, outputPath);
					}
				}
				writer.close();

				if (sc.ioException() != null) {
					throw sc.ioException();
				}
			}
		}
		System.out.println("total line is:" + totalLine);
	}

	private static BufferedWriter createFile(int index, String outputPath) throws IOException {
		String name = outputPath + "item_sub_" + index + ".sql";
		File writeFile = new File(name);
		return new BufferedWriter(new OutputStreamWriter(new FileOutputStream(writeFile), "UTF-8"));
	}

 

© 著作权归作者所有

lifereader
粉丝 1
博文 24
码字总数 11232
作品 0
广州
架构师
私信 提问
python开发大全、系列文章、精品教程

全栈工程师开发手册 (作者:栾鹏) python教程全解 python基础教程 python基础系列教程——Python的安装与测试:python解释器、PyDev编辑器、pycharm编译器 python基础系列教程——Python库...

luanpeng825485697
2017/10/25
0
0
Divide and conquer method

  分治法是最广泛使用的算法设计方法之一,其基本思想:把大问题分解成一些较小的问题,然后由小问题的解方便地构造出大问题的解。   分治法说穿了就是把问题放小,如果被分的问题还是比...

graylee
2013/11/08
0
0
从贝叶斯理论到图像马尔科夫随机场

本节主要介绍马尔科夫的随机场模型以及其用于图像的分割算法中。基于马尔科夫的随机场(MRF)的图像分割是一种基于统计的图像分割算法,其模型参数少,空间约束性强,使用较为广泛。 首先了解...

on2way
2015/08/06
0
0
一个demo学会js

全栈工程师开发手册 (作者:栾鹏) 快捷链接: js系列教程1-数组操作全解 js系列教程2-对象和属性全解 js系列教程3-字符串和正则全解 js系列教程4-函数与参数全解 js系列教程5-容器和算法全...

luanpeng825485697
2017/08/04
0
0
MongoDB系列教程(八):GridFS存储详解

MongoDB系列教程(八):GridFS存储详解 GridFS简介 mongoDB的文档以BSON格式存储,支持二进制的数据类型,当我们把二进制格式的数据直接保存到mongoDB的文档中。但是当文件太大时,例如图片...

开元中国2015
2015/07/25
390
0

没有更多内容

加载失败,请刷新页面

加载更多

nginx学习笔记

中间件位于客户机/ 服务器的操作系统之上,管理计算机资源和网络通讯。 是连接两个独立应用程序或独立系统的软件。 web请求通过中间件可以直接调用操作系统,也可以经过中间件把请求分发到多...

码农实战
58分钟前
5
0
Spring Security 实战干货:玩转自定义登录

1. 前言 前面的关于 Spring Security 相关的文章只是一个预热。为了接下来更好的实战,如果你错过了请从 Spring Security 实战系列 开始。安全访问的第一步就是认证(Authentication),认证...

码农小胖哥
今天
9
0
JAVA 实现雪花算法生成唯一订单号工具类

import lombok.SneakyThrows;import lombok.extern.slf4j.Slf4j;import java.util.Calendar;/** * Default distributed primary key generator. * * <p> * Use snowflake......

huangkejie
昨天
12
0
PhotoShop 色调:RGB/CMYK 颜色模式

一·、 RGB : 三原色:红绿蓝 1.通道:通道中的红绿蓝通道分别对应的是红绿蓝三种原色(RGB)的显示范围 1.差值模式能模拟三种原色叠加之后的效果 2.添加-颜色曲线:调整图像RGB颜色----R色增强...

东方墨天
昨天
11
1
将博客搬至CSDN

将博客搬至CSDN

算法与编程之美
昨天
12
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部