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

教你将Linux 大文件处理小

[复制链接]
gaosmile 发布时间:2020-9-24 22:53
1.背景
工作中使用MapReduce任务导出一批含有路径的文件,共计行数300W+,需要检测文件是否在对应的服务器中存在,而文件所在的服务器并非hadoop集群的服务器,因此打算采用bash脚本进行。具体的方法如下(可直接看方法2,方法1效率较低):
2. 采用的方法
a. 方法1
原本打算使用如下脚本,进行简单验证:

  1. !/bin/bash
  2. count=0
  3. cat oriTest.txt | while read data
  4. do
  5. count=$(( $count+1 ))
  6. echo $count
  7. dir=echo "$data" | awk -F "\t" '{print $5}'
  8. if [ -e $dir ];then
  9. echo "$data" >> exist.txt
  10. else
  11. echo "$data" >> noexist.txt
  12. fi
  13. done
复制代码

原始数据格式如下:
name mark id dir
运行时发现处理5000行需要将近4、5分钟的时间(机器为8核),果断不行啊,随后打算采用多进程的方法来执行,见方法2
b. 方法2
主要是通过将大文件分为小文件,然后对小文件进行后台遍历读取,脚本如下:

  1. !/bin/bash
  2. source ~/.bashrc
复制代码

判断路径是否存在

  1. readdata(){
  2. cat $1 | while read data
  3. do
  4. dir=echo "$data" | awk -F "\t" '{print $5}'
  5. if [ -e $dir ];then
  6. echo "$data" >> "exist_$1.txt"
  7. else
  8. echo "$data" >> "noexist_$1.txt"
  9. fi
  10. done
  11. }
复制代码


大文件切分为小文件,生成文件名为xaa,axb等(可以自己命名文件)
split -l 10000 oriTest.txt
declare -a files # 声明数组
files=($(ls x*)) # 分割后的小文件名保存数组
遍历,并后台执行

  1. for i in ${files[@]};do
  2. echo $i
  3. readdata $i &
  4. done
复制代码


收藏 评论0 发布时间:2020-9-24 22:53

举报

0个回答

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版