• Linux大文件快速处理小方法


    1. 背景

      工作中使用MapReduce任务导出一批含有路径的文件,共计行数300W+,需要检测文件是否在对应的服务器中存在,而文件所在的服务器并非hadoop集群的服务器,因此打算采用bash脚本进行。具体的方法如下(可直接看方法2,方法1效率较低):

      2. 采用的方法

      a. 方法1

      原本打算使用如下脚本,进行简单验证:

    #!/bin/bash
    count=0
    cat oriTest.txt | while read data
    do
        count=$(( $count+1 ))
        echo $count
        dir=`echo "$data" | awk -F "	" '{print $5}'`
        if [ -e $dir ];then
            echo "$data" >> exist.txt
        else
            echo "$data" >> noexist.txt
        fi
    done

       原始数据格式如下:

    1      name  mark        id  dir

       运行时发现处理5000行需要将近4、5分钟的时间(机器为8核),果断不行啊,随后打算采用多进程的方法来执行,见方法2

      b. 方法2

      主要是通过将大文件分为小文件,然后对小文件进行后台遍历读取,脚本如下:

    #!/bin/bash
    
    source ~/.bashrc
    
    # 判断路径是否存在
    readdata(){
        cat $1 | while read data
        do
            dir=`echo "$data" | awk -F "	" '{print $5}'`
            if [ -e $dir ];then
                echo "$data" >> "exist_$1.txt"
            else
                echo "$data" >> "noexist_$1.txt"
            fi
        done
    }
    
    # 大文件切分为小文件,生成文件名为xaa,axb等(可以自己命名文件)
    split -l 10000 oriTest.txt
    
    declare -a files # 声明数组
    files=($(ls x*)) # 分割后的小文件名保存数组
    
    # 遍历,并后台执行
    for i in ${files[@]};do
        echo $i
        readdata $i &
    done

      执行效率因机器性能不同而不同,使用8核的机器执行300W的数据需要十几分钟完成

  • 相关阅读:
    根据dateFormatter创建NSDate类型数据
    centos6.5下oracle自动备份删除指定天数的文件
    svg-edit和svg中的自定义属性
    vc读取当前路径和读取配置ini文件
    powerdesiner技巧
    oracle理解和导入导出
    highstock无图像
    winform中datagridview刷新后的排序记忆
    freemarker取数
    winform clickonce在线安装
  • 原文地址:https://www.cnblogs.com/mengrennwpu/p/6337009.html
Copyright © 2020-2023  润新知