需求分析:
我们需要将超大文本进行入库操作,需要进行拆分拆分操作,该系列分为三篇讲解:
- 一、文件拆分 - 将大文件拆分小文件,代码操作也能实现,但是没有Linux自带的命令效率高;
- 二、读写入库 - 将拆分后的小文件,通过读和写协程进行,边读边写入库,批量插入数据库(无序);
- 三、水平拆分 - 超大入库单表需要水平拆分,否则影响性能(2kw+),通过SQL命令操作,效率高;
一、文件拆分 - 文件切割处理
文件切割,大文件转小文件
- 将大文件按照行数切割,成小文件,有以下几种方式;
# 常用命令
-b:值为每一输出档案的大小,单位为 byte。
-C:每一输出档中,单行的最大 byte 数。
-d:使用数字作为后缀。
-l:值为每一输出档的行数大小。
-a:指定后缀长度(默认为2)。
# 以下是 split --help中的全部命令
-a, --suffix-length=N 生成长度为 N 的后缀(默认为 2)
--additional-suffix=SUFFIX 附加一个附加的 SUFFIX 到文件名
-b, --bytes=SIZE 为每个输出文件放置 SIZE 个字节
-C, --line-bytes=SIZE 每个输出文件最多放置 SIZE 个字节的记录
-d 使用从 0 开始的数字后缀,而不是字母
--numeric-suffixes[=FROM] 与 -d 相同,但允许设置起始值
-x 使用从 0 开始的十六进制后缀,而不是字母
--hex-suffixes[=FROM] 与 -x 相同,但允许设置起始值
-e, --elide-empty-files 不使用“-n”生成空输出文件
--filter=COMMAND 写入 shell 命令;文件名为 $FILE
-l, --lines=NUMBER 为每个输出文件放置 NUMBER 行/记录
-n, --number=CHUNKS 生成 CHUNKS 输出文件;见下面的解释
-t, --separator=SEP 使用 SEP 而不是换行符作为记录分隔符;
'\0'(零)指定 NUL 字符
-u, --unbuffered 立即使用 '-n r/...' 将输入复制到输出
--verbose 在每个之前打印一个诊断
输出文件打开
--help 显示此帮助并退出
--version 输出版本信息并退出
按照行数
- 每100w条,拆分写入一个文件,如:smallFile_0000/smallFile_0001/smallFile_0002/smallFile_0003…
split -l 1000000 hg19_gnomad211_exome.txt -d -a 4 smallFile_
# 将genome也按行切割
split -l 3000000 hg19_gnomad211_genome.txt -d -a 3 newFile_
按照文件大小(容易截断文本)
- 每300M数据,拆分写入一个文件,如:newFile_000/newFile_001/newFile_002/newFile_003
split -b 300m hg19_gnomad211_genome.txt -d -a 3 newFile_
切开的文件还能合并
- 将多个newFile ,再合并为 hg19_gnomad211_exome.txt
cat newFile* > hg19_gnomad211_exome.txt