大文件处理操作-mybatis 的批量插入数据

目标

最近有一个需求,ip 黑名单统计,文件内容大概是以下如此

100.100.100.121		|爬虫:fei:20190806|代理:b_feilong_e:20191001	
192.225.115.175		|垃圾邮件:abc:20191014	

文本 blackip.txt 有有八千多万行,文件大小有6.5G的内容,需要根据 爬虫代理分不同的文件存储ip

处理思路

正常的处理思路:将文件加载到内存,根据行中包含的关键字 爬虫代理,就可以分到不同的文件,但是因为这个文件太大了,没办法一次性将文件加载到内存中,所有这种方式不可行,所以先将大文件分割多个小文件

linux 分割文件

根据文件大小分割文件

split --bytes 500M --numeric-suffixes --suffix-length=3 blackip.txt blackip_split_size_

将文件 blackip.txt 分割成一个文件大小是500M 的多个小文件,文件名 blackip_split_size_000, blackip_split_size_001。。。。等多个文件

根据文件行分割文件

split --lines 4000000 --numeric-suffixes --suffix-length=3 blackip.txt blackip_split_line_

将文件 blackip.txt 分割成一个文件行是4000000 的多个小文件,文件名 blackip_split_line_000, blackip_split_line_001。。。。等多个文件

如果按照文件大小分割文件的话,可能将同一行的数据分在不同的文件,所有使用按行分割,分成多个文件
以下处理文件 blackip_split_line_000, blackip_split_line_001

然后多线程处理单个文件,获取到多个IP 文件,然后将结果合并 ,可用命令

cat a.txt b.txt >> c.txt

将a.txt 和 b.txt 文件合并到 c.txt 文件中

最后合并的结果文件 allip_proxy_brush_uniq.txt 大小,213M 数据有一千五百万条数据

这个文件大小的数据,是可以一次加载到内存的

加载到数据库中

首先得设计表结构 proxy_brush

CREATE TABLE `proxy_brush` (
  `id` int(11) NOT NULL,
  `ip` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;

生成sql文件 proxy_brush_tmp1.sql

 insert into proxy_brush(id,ip) values (1,'100.100.100.121'),(2,'100.100.100.122'),.......

以上文件有400M左右
登录cmd ,mysql -uroot -p mysql 的命令有 ,use databases

load data local infile ‘f:\proxy_brush_tmp1.sql’ into table proxy_brush

由于以上文件太大,通过客户端 navicat ,不能一次加载完成,容易导致超时,不可行
使用 source F:\proxy_brush_tmp1.sql 命令也容易超时

所以只能换一种方式导入,如果生成

insert into proxy_brush(id,ip) values (1,'100.100.100.121')
insert into proxy_brush(id,ip) values (2,'100.100.100.121')

导入速度很慢的

mybatis 使用批处理实现

mapper 实现

<insert id="insertBatch" parameterType="java.util.List">
        insert into proxy_brush(id,ip) values
        <foreach collection="lists" item="item" index="i" separator=",">
            (#{item.id},#{item.ip})
        </foreach>
    </insert>

dao接口实现

  /**
     * 批量插入数据
     * @param lists
     */
    public void insertBatch(@Param("lists") List<ProxyBrush> lists);

ProxyBrush 设计很简单

public class ProxyBrush extends Model<ProxyBrush> {
    private static final long serialVersionUID = -7876888313791106541L;
    /**
     * 自增ID
     */
    private int id;

    private String ip;

    @Override
    protected Serializable pkVal() {
        return null;
    }
}

导入速度很快的,大约也就几分钟就可以导入一千五百多万条数据

至此整个大文件处理并批量导入数据完成

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值