Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash-从GZIP文件中提取匹配字符串的速度非常慢_Bash_Parallel Processing_Gnu - Fatal编程技术网

Bash-从GZIP文件中提取匹配字符串的速度非常慢

Bash-从GZIP文件中提取匹配字符串的速度非常慢,bash,parallel-processing,gnu,Bash,Parallel Processing,Gnu,Bash中的完全新手。试图迭代通过1000个gzip文件,可能是GNU并行的解决方案 #!/bin/bash ctr=0 echo "file_name,symbol,record_count" > $1 dir="/data/myfolder" for f in "$dir"/*.gz; do gunzip -c $f | while read line; do str=`echo $line | cut -d"|" -f1` if [ "$str" == "H

Bash中的完全新手。试图迭代通过1000个gzip文件,可能是GNU并行的解决方案

#!/bin/bash
ctr=0
echo "file_name,symbol,record_count" > $1
dir="/data/myfolder"
for f in "$dir"/*.gz; do

  gunzip -c $f | while read line;
  do
    str=`echo $line | cut -d"|" -f1`
    if [ "$str" == "H" ]; then
      if [ $ctr -gt 0 ]; then
        echo "$f,$sym,$ctr" >> $1
      fi
      ctr=0
      sym=`echo $line | cut -d"|" -f3`
      echo $sym
    else
      ctr=$((ctr+1))
    fi
  done
done

任何有助于加快流程的帮助都将不胜感激

Bash
while read
循环可能是这里的主要瓶颈。调用多个外部进程进行简单的字段拆分会加剧问题。简而言之

#!/bin/bash
ctr=0
export ctr
echo "file_name,symbol,record_count" > $1
dir="/data/myfolder"
export dir

doit() {
  f="$1"
  gunzip -c $f | while read line;
  do
    str=`echo $line | cut -d"|" -f1`
    if [ "$str" == "H" ]; then
      if [ $ctr -gt 0 ]; then
        echo "$f,$sym,$ctr"
      fi
      ctr=0
      sym=`echo $line | cut -d"|" -f3`
      echo $sym >&2
    else
      ctr=$((ctr+1))
    fi
  done
}
export -f doit

parallel doit ::: *gz 2>&1 > $1 
while IFS="|" read -r first second third rest; do ...
利用shell内置的字段拆分功能,但您可能希望将整个过程转换为一个简单的Awk脚本

echo“文件名、符号、记录计数”>“$1”
对于“/data/myfolder”/*.gz中的f;做
gunzip-c“$f”|
awk-F“\\\”-vf=“$F”-vofs=“,”
/H/{if(ctr)打印f、sym、ctr
中心利率=0;平均利率=3美元;
打印sym>“/dev/stderr”
下一个}
{++ctr}'
完成>>“$1”

这模糊地假设打印单独的
sym
仅用于诊断。如果这是一个不正确的假设,希望不难看出如何重构这1000个文件。

你能解释一下你想用这1000个文件做什么吗?从每个Gzip文本文件中提取一个字符串,从任何以“H”开头的行的第三个管道分隔空间中提取一个字符串,当人们询问性能是如何衡量的。换句话说,使用探查器找出哪些操作花费的时间最多。我在这里考虑的一些事情:使用<代码> ZCAT<代码>而不是<代码> GunZip < /代码>。使用
zgrep-e'^H'
查找以“H”开头的行。另一个有用的工具是
sed
。除此之外,为了让它更并行地运行,我不会使用Bash。我会检查
zgrep-P'^H[^ |]*\\\\\\\\\\\\\\\\\\\\\\\K[^ |]*'“$dir/*.gz
是否更快。它处理解压、“行是否以H开头”过滤器和单个命令中的第三个字段提取。>Aaron,这是一个很好的提示…我提取所有H行的速度要快得多现在我没有提到我的代码正在做的另一件事,我正在计算连续H行>Ulrich之间的行数……将python多处理视为一种未经测试的替代方法;如果您需要测试,请使用一个小示例输入和预期输出更新问题。