Bash-从GZIP文件中提取匹配字符串的速度非常慢
Bash中的完全新手。试图迭代通过1000个gzip文件,可能是GNU并行的解决方案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
#!/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多处理视为一种未经测试的替代方法;如果您需要测试,请使用一个小示例输入和预期输出更新问题。