zoukankan      html  css  js  c++  java
  • Linux大文件切割

    日常工作中需要对日志文件进行分析,当日志文件过大时,Linux中使用vim、cat、grep、awk等这些工具对大文件日志进行分析将会成为梦魇,具体表现在:

    • 执行速度缓慢,文件内容需要加载到内存中,涉及大量的磁盘读;

    • 耗费资源过多,一个4G空间的日志文件需要至少4G的内存,更大的呢?

    • 内容难以复用,分析过滤文件时会用管道对输出文件进行处理,大文件下难以复用;

    • 文件传输困难,大文件需要传输给其他人进行分析,文件太大,全量传输带宽耗费大

    1 查阅大文件之痛

    大数据离线处理框架hadoop可以处理这些场景,然而hadoop也需要耗费较长的时间进行计算,而且还需要去编写MapReduce任务,诚然这种方法带来更大的难度和挑战。hadoop是通过将大文件切割成多个小文件,通过多个mapreduce任务做并行处理,Linux提供了一个简单易用的split工具,可以实现将文件切割成多个小文件。

    split提供两种方式对文件进行切割:

    • 根据行数切割,通过-l参数指定需要切割的行数

    • 根据大小切割,通过-b参数指定需要切割的大小

    2.1 根据行数切割

    本地没有大日志,就拿小日志进行演示,指定文件名为split-line,-d参数以数字的方式显示

    [root@iZ1la3d1xbmukrZ ~]# wc -l err_20190907.log
    3427 err_20190907.log
    [root@iZ1la3d1xbmukrZ ~]# split -l 300 -d --verbose err_20190907.log split-line
    creating file ‘split-line00’
    creating file ‘split-line01’
    creating file ‘split-line02’
    creating file ‘split-line03’
    creating file ‘split-line04’
    creating file ‘split-line05’
    creating file ‘split-line06’
    creating file ‘split-line07’
    creating file ‘split-line08’
    creating file ‘split-line09’
    creating file ‘split-line10’
    creating file ‘split-line11’
    [root@iZ1la3d1xbmukrZ ~]# ls -lh split-line0[0-9]
    -rw-r--r-- 1 root root 28K Mar 11 19:50 split-line00
    -rw-r--r-- 1 root root 27K Mar 11 19:50 split-line01
    -rw-r--r-- 1 root root 24K Mar 11 19:50 split-line02
    -rw-r--r-- 1 root root 24K Mar 11 19:50 split-line03
    -rw-r--r-- 1 root root 23K Mar 11 19:50 split-line04
    -rw-r--r-- 1 root root 18K Mar 11 19:50 split-line05
    -rw-r--r-- 1 root root 26K Mar 11 19:50 split-line06
    -rw-r--r-- 1 root root 25K Mar 11 19:50 split-line07
    -rw-r--r-- 1 root root 24K Mar 11 19:50 split-line08
    -rw-r--r-- 1 root root 24K Mar 11 19:50 split-line09

    指定行数后会自动做切割,即达到300行之后自动切割,通过-d参数文件名会自动以数字的方式命名,切割后,每个文件大小为24K,此时再对文件进行分析将会方便很多,同时文件数量也会很多,可以增加行数的方式进行切割,方便分析。

    2.2 根据大小切割

    除了按照行数切割之外,split还支持通过文件大小进行切割,通过指定-b参数指定文件大小进行切割,文件大小单位支持K, M, G, T, P, E, Z,如下以切割为30K演示文件切割过程

    [root@iZ1la3d1xbmukrZ ~]# split -b 30K -d --verbose err_20190907.log split-size
    creating file ‘split-size00’
    creating file ‘split-size01’
    creating file ‘split-size02’
    creating file ‘split-size03’
    creating file ‘split-size04’
    creating file ‘split-size05’
    creating file ‘split-size06’
    creating file ‘split-size07’
    creating file ‘split-size08’
    creating file ‘split-size09’
    [root@iZ1la3d1xbmukrZ ~]# ll -h
    total 916K
    -rw-r--r--  1 root root 273K Mar 11 19:47 err_20190907.log
    -rw-r--r--  1 root root  28K Mar 11 19:50 split-line00
    -rw-r--r--  1 root root  27K Mar 11 19:50 split-line01
    -rw-r--r--  1 root root  24K Mar 11 19:50 split-line02
    -rw-r--r--  1 root root  24K Mar 11 19:50 split-line03
    -rw-r--r--  1 root root  23K Mar 11 19:50 split-line04
    -rw-r--r--  1 root root  18K Mar 11 19:50 split-line05
    -rw-r--r--  1 root root  26K Mar 11 19:50 split-line06
    -rw-r--r--  1 root root  25K Mar 11 19:50 split-line07
    -rw-r--r--  1 root root  24K Mar 11 19:50 split-line08
    -rw-r--r--  1 root root  24K Mar 11 19:50 split-line09
    -rw-r--r--  1 root root  24K Mar 11 19:50 split-line10
    -rw-r--r--  1 root root 9.8K Mar 11 19:50 split-line11
    -rw-r--r--  1 root root  30K Mar 11 19:52 split-size00
    -rw-r--r--  1 root root  30K Mar 11 19:52 split-size01
    -rw-r--r--  1 root root  30K Mar 11 19:52 split-size02
    -rw-r--r--  1 root root  30K Mar 11 19:52 split-size03
    -rw-r--r--  1 root root  30K Mar 11 19:52 split-size04
    -rw-r--r--  1 root root  30K Mar 11 19:52 split-size05
    -rw-r--r--  1 root root  30K Mar 11 19:52 split-size06
    -rw-r--r--  1 root root  30K Mar 11 19:52 split-size07
    -rw-r--r--  1 root root  30K Mar 11 19:52 split-size08
    -rw-r--r--  1 root root 2.8K Mar 11 19:52 split-size09
    drwxr-xr-x 13 root root 4.0K Mar  3 18:03 utils
    [root@iZ1la3d1xbmukrZ ~]#

    2.3 多文件合并

    split将大文件切割为多个小文件,如果需要将多个小文件合并为一个文件怎么处理呢?
    可以使用文件重定向方式实现,如下演示两个小文件合并为一个文件

     右边滑动查看完整命令

    [root@iZ1la3d1xbmukrZ ~]# cat split-line00 split-line01 >two-file-merge
    [root@iZ1la3d1xbmukrZ ~]# ll
    total 624
    -rw-r--r--  1 root root 279331 Mar 11 19:47 err_20190907.log
    -rw-r--r--  1 root root  28017 Mar 11 19:50 split-line00
    -rw-r--r--  1 root root  27386 Mar 11 19:50 split-line01
    -rw-r--r--  1 root root  24354 Mar 11 19:50 split-line02
    -rw-r--r--  1 root root  24409 Mar 11 19:50 split-line03
    -rw-r--r--  1 root root  23434 Mar 11 19:50 split-line04
    -rw-r--r--  1 root root  18207 Mar 11 19:50 split-line05
    -rw-r--r--  1 root root  26139 Mar 11 19:50 split-line06
    -rw-r--r--  1 root root  25057 Mar 11 19:50 split-line07
    -rw-r--r--  1 root root  24536 Mar 11 19:50 split-line08
    -rw-r--r--  1 root root  23926 Mar 11 19:50 split-line09
    -rw-r--r--  1 root root  23863 Mar 11 19:50 split-line10
    -rw-r--r--  1 root root  10003 Mar 11 19:50 split-line11
    -rw-r--r--  1 root root  55403 Mar 11 19:51 two-file-merge

    合并方式通过读取文件的方式+输出重定向,对于大文件一样会存在性能的问题,建议根据需要使用

  • 相关阅读:
    Fibonacci Again
    N的10000的阶乘
    HDU2141(二分搜索)
    POJ2366(HASH法)
    10106 Product
    UVA 401 Palindromes
    UVA424 Integer Inquiry
    POJ2503(二分搜索)
    mysql重置root密码
    tidb安装haproxy负载均衡
  • 原文地址:https://www.cnblogs.com/dalianpai/p/12464980.html
Copyright © 2011-2022 走看看