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

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

  • 相关阅读:
    leetcode 18 4Sum
    leetcode 71 Simplify Path
    leetcode 10 Regular Expression Matching
    leetcode 30 Substring with Concatenation of All Words
    leetcode 355 Design Twitte
    leetcode LRU Cache
    leetcode 3Sum
    leetcode Letter Combinations of a Phone Number
    leetcode Remove Nth Node From End of List
    leetcode Valid Parentheses
  • 原文地址:https://www.cnblogs.com/dalianpai/p/12464980.html
Copyright © 2011-2022 走看看