Bashスクリプトのパフォーマンス

Bashスクリプトのパフォーマンス

スクリプトでは、bash範囲の一部の整数が生成され、固定文字列に関連付けられてファイルに印刷されます。オペレーティングシステムはUbuntu 14.04で、bashバージョンは4.3.11(1)-release

印刷する文字列(および行)は数百万個あります。以下はiotopハードドライブの使用回数です。

 TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN     IO>    COMMAND  
5701 be/4 myuser    408.24 B/s   97.27 K/s  0.00 %  0.23 % bash ./script.sh
5701 be/4 myuser    408.20 B/s   97.27 K/s  0.00 %  0.00 % bash ./script.sh
5701 be/4 myuser    408.41 B/s   95.72 K/s  0.00 %  0.11 % bash ./script.sh

100万文字の文字列を印刷するのに約16分かかります。ハードドライブの帯域幅は飽和状態からは離れています。uptime15分以上実行した後:

load average: 0,97, 1,14, 1,19

4コアCPUで。したがって、CPUやハードドライブの両方が非常に遅い実行の原因ではないようです。

  1. このプロセスをどのように加速できますか?

  2. これはまだ可能ですかbash、それとも別の言語を使用する必要がありますか?


スクリプトの関連部分は次のとおりです。

#!/bin/bash

i=0
a='fixedstring1'
b='fixedstring2'

while [[ $i -le 9999999 ]]; do
[...]
    ur="$a""$b""$i"
[...]
    echo $ur >> exp1/file$m
[...]
    (( i++ ))
done

file$m生成された最初のファイルですm。スクリプトは、すべての行を含む一意のファイルではなく、固定数の行を含む複数のファイルを生成します。

ベストアンサー1

あなたの場合、Bashループは非常に遅いです。

> cat test-1.sh
#!/bin/sh

i=0
a='fixedstring1'
b='fixedstring2'


while [ $i -lt ${1:-9} ]; do
  ur="$a""$b""$i"
  echo $ur
  (( i++ ))
done

> time sh test-1.sh 999999 | wc -l
...
real    1m11.488s

jot(または)を使用するとseq速度が速くなります。

> cat test-3.sh
#!/bin/sh

a='fixedstring1'
b='fixedstring2'

jot -w "$a$b" ${1:-9}
# seq -f "$a$b%g" ${1:-9}
> time sh test-3.sh 999999 | wc -l
...
real    0m0.613s

そして、デジタルアーカイブを分割するロジックは何ですか?単純に行数を制限するには、split次のコマンドを使用できます(これはオプションのGNU split使用を意味します-d)。

sh test-3.sh | split -d -l "how much lines in one file" - expr1/file

おすすめ記事