你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

教你将Linux 大文件处理小

[复制链接]
gaosmile 发布时间:2020-9-24 22:53
1.背景
工作中使用MapReduce任务导出一批含有路径的文件,共计行数300W+,需要检测文件是否在对应的服务器中存在,而文件所在的服务器并非hadoop集群的服务器,因此打算采用bash脚本进行。具体的方法如下(可直接看方法2,方法1效率较低):
2. 采用的方法
a. 方法1
原本打算使用如下脚本,进行简单验证:
  1. 8 ~* u1 |& k: u. E9 i" c( H
  2. !/bin/bash& E( [2 w4 m2 R2 w6 s8 z
  3. count=0
    . U/ }$ N1 [- s- a: Q! Z
  4. cat oriTest.txt | while read data: @$ X/ h  L; W: ^( _( h
  5. do! `& b! [* C/ R" c8 Z; X
  6. count=$(( $count+1 ))
    : I5 a: s2 g0 s* H
  7. echo $count
    3 D; u7 V& {  r6 d$ m9 H
  8. dir=echo "$data" | awk -F "\t" '{print $5}'" m8 q- g% B) O8 Z+ b8 c
  9. if [ -e $dir ];then
    1 H0 h8 S# k0 W
  10. echo "$data" >> exist.txt3 O# A, p5 r3 g2 m- O0 U+ _* ~
  11. else. y4 m7 j; x# R  D/ v
  12. echo "$data" >> noexist.txt1 f/ s8 ?( O" j1 W; V( a% z
  13. fi
    # p) K# z5 Y% t: F, }$ F! Q4 c
  14. done
复制代码
" X1 Y, |" a' ]  N; Q
原始数据格式如下:
$ W$ g  k' k9 A. B
name mark id dir
运行时发现处理5000行需要将近4、5分钟的时间(机器为8核),果断不行啊,随后打算采用多进程的方法来执行,见方法2
b. 方法2
主要是通过将大文件分为小文件,然后对小文件进行后台遍历读取,脚本如下:

  1. ; X. r9 s8 l, K7 {0 s" X
  2. !/bin/bash
    ; ?- c0 J( z$ k1 b0 g' ?5 w, L
  3. source ~/.bashrc
复制代码

$ \+ Y5 i" d, R5 y; t8 X
判断路径是否存在

  1. ' ~) W; q- i2 _: P
  2. readdata(){
    4 o6 s+ q- [# X* x% U1 V7 k4 a
  3. cat $1 | while read data
    1 ]; \5 W* z' M- C9 R
  4. do
    ' n( m% E* I& Z/ y
  5. dir=echo "$data" | awk -F "\t" '{print $5}'0 n" x3 B) a5 Q' a8 [
  6. if [ -e $dir ];then$ |0 n( f/ V/ v" S3 L$ O. G7 f4 G* w
  7. echo "$data" >> "exist_$1.txt"  o+ y6 i, M2 d, f4 A7 q0 O. \4 r
  8. else5 |  P* n6 c9 I' t8 `
  9. echo "$data" >> "noexist_$1.txt"
    9 R8 g' W5 u) B7 [8 y2 a- G& Y# Y
  10. fi2 W! K; f- n5 s/ x4 P) z
  11. done8 q: i1 f- }# z
  12. }
复制代码

, H5 z* [1 S8 l& E7 k5 t/ x5 e5 j. N, K+ _0 P. ~' Z
大文件切分为小文件,生成文件名为xaa,axb等(可以自己命名文件)
split -l 10000 oriTest.txt
declare -a files # 声明数组
files=($(ls x*)) # 分割后的小文件名保存数组
遍历,并后台执行% p. l  ?* e) d9 D

  1. 7 w9 Y) j) h5 \. K0 }
  2. for i in ${files[@]};do! v2 i5 r2 ~) F  c
  3. echo $i0 }& Q$ a6 U7 \! N, G8 M, U
  4. readdata $i &% \- ?1 E5 K' \  j/ r/ v. x
  5. done
复制代码

% B# w: n1 E7 f5 Z
9 b* q5 W- ~$ a% s  |* H5 f0 e
赞 收藏 评论0 发布时间:2020-9-24 22:53

举报

0个回答

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版