スクリプトでは、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分かかります。ハードドライブの帯域幅は飽和状態からは離れています。uptime
15分以上実行した後:
load average: 0,97, 1,14, 1,19
4コアCPUで。したがって、CPUやハードドライブの両方が非常に遅い実行の原因ではないようです。
このプロセスをどのように加速できますか?
これはまだ可能ですか
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