Shell脚本多线程运行

时间:2018-09-05 01:05:24

标签: multithreading shell

我有用于拆分xml文件的shell脚本。但是在客户环境中有100万个xml文件。脚本运行缓慢。可以运行多线程模式吗?

谢谢!

我的shell脚本:

#!/bin/sh
File=/home/spark/PktLog
count=0
startLine=(`sed -n -e '/?xml version="1.0" encoding/=' $File`)
fileEnd=`sed -n '$=' $File`
endLine=(`echo ${startLine[*]} | awk -v a=$fileEnd '{for(i=2;i<=NF;i++) printf("%d ",$i-1);print a}'`)

let maxIndex=${#startLine[@]}-1

for n in `seq 0 $maxIndex`

do
    sed -n "${startLine[$n]},${endLine[$n]}p" $File >result_${n}.xml
done

echo $startLine[@]`enter code here`

1 个答案:

答案 0 :(得分:1)

您的方法非常慢,因为它会多次读取输入文件。

与其尝试通过多线程来使其更快,您应该重写脚本以仅读取输入文件一次。

这是示例输入文件:

$ cat testfile
<?xml version="1.0" encoding="UTF-8"?>
<test>
  <some data />
</test>
<?xml version="1.0" encoding="UTF-8"?>
<test>
  <more />
  <data />
</test>
<?xml version="1.0" encoding="UTF-8"?>
<test>
  <more type="data" />
</test>

这是一条awk命令,可以一次读取文件,并将每个文档写入单独的文件:

$ awk 'BEGIN { file="/dev/null"; n=0; }
       /xml version="1.0" encoding/ {
          close(file); 
          file="file" ++n ".xml"; 
       }
       {print > file;}' testfile

这是结果:

$ cat file1.xml
<?xml version="1.0" encoding="UTF-8"?>
<test>
  <some data />
</test>

$ cat file2.xml
<?xml version="1.0" encoding="UTF-8"?>
<test>
  <more />
  <data />
</test>

这快得多:

$ grep -c 'xml version' PktLog
3000

$ time ./yourscript    
real    0m9.791s
user    0m6.849s
sys     0m2.660s

$ time ./thisscript
real    0m0.248s
user    0m0.130s
sys     0m0.107s