需求:
现在有个40G的文件,文件内容格式:
111---222
111---222
结果:111(一个字段)
222(一个字段)
导入到数据库中
请问这种需求应该怎么处理比较合适?
40G的文件数据直接存数据库?
这么大的文件可以用分片读取,然后批量插入数据库。
使用BufferedReader读取,使用数据库事务来进行插入。
数据库不知道你使用的是什么接口,我就省略了。
String encoding = "UTF-8";
BufferedReader reader = null;
try {
// 开始数据库事务
// ......
reader = new BufferedReader(new InputStreamReader(new FileInputStream("/bigfile.txt"), encoding));
int count = 0;
for (String line; (line = reader.readLine()) != null;) {
// 解析行数据,插入到数据库
}
} finally {
close(reader);
// 结束数据库事务
// ......
}
根据字符集导入 尽量不要使用第三方显式数据库管理软件使用
想当年被问过这个问题 40G单纯插入 都弄死了 面试官最后说的用用数据库自带的load
可以参考如下链接:
30G的大文件,如何快速全部导入到数据库 https://www.ahfesco.com.cn/affairs/article.asp?id=3534
RandomAccessFile
使用JDK的这个类,不会一次性加载整个大文件,一行一行读取,
读一部分,写一部分,
可以全部读完。
可以使用hadoop来操作,磁盘空间足够就可以
先把文件进行切割成小文件,
然后在多线程文件读取
采用批量插入数据库
Java按行读取大文件
通常读取一个文件都是直接把这个文件转化为流的形式,但是对于一个容量为几个G的文件,这很显然是不明智的做法,当前我需要将几个G的文件读取,然后插入到数据库,使用的是一个commons的jar包,尝试了一下,真的很不错。
pom.xml
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-io</artifactId>
<version>1.3.2</version>
</dependency>
demo.java
@Test
void insert() throws Exception {
LineIterator it = FileUtils.lineIterator(new File("E:\\1\\jingyou.json"));
try {
while (it.hasNext()) {
String line = it.nextLine();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
LineIterator.closeQuietly(it);
}
}