次のbashスクリプトをそのまま実行しています。つまり、順番に進みます。とは、データベースからファイルをダウンロードするための呼び出しprefetch
であり、インポートされたファイルを縮小するために作成したC ++プログラムです(制限された記憶領域のため)。fastq-dump
_shrink
この機能を実装するためにスレッドを使用できますか?ファイルのダウンロードに時間がかかります。
重要!各ブロック内の命令は順番に実行する必要がありますが、ブロックは並列に実行できます。そして一度に10ブロックだけ実行したいと思います。
#!/bin/bash
g++ -std=c++11 shrink_files.cpp -o _shrink
#block1
prefetch SRR837459
fastq-dump --fasta 0 SRR837459
rm ../../sra_sequences/sra/SRR837459.sra
./_shrink SRR837459
rm SRR837459.fasta
echo "SRR837459" >> list_of_done.txt
#block1
prefetch SRR805782
fastq-dump --fasta 0 SRR805782
rm ../../sra_sequences/sra/SRR805782.sra
./_shrink SRR805782
rm SRR805782.fasta
echo "SRR805782" >> list_of_done.txt
#... more blocks
ベストアンサー1
コマンドを並列化する良い方法は次のとおりです。牛に似た一種の栄養parallel
。ブロックを関数として定義します。グレンジャックマンが提案したものその後、並列に実行され、-j
最大並列実行を定義できます。 Glennのアプローチに比べて利点は、1つのブロックが完了すると新しいブロックが開始されるため、常に10個のブロックが同時に実行されることです。これを表示するには、並列関数をエクスポートする必要があります。
#!/bin/bash
g++ -std=c++11 shrink_files.cpp -o _shrink
block() {
prefetch "$1"
fastq-dump --fasta 0 "$1"
...
}
export -f block
parallel -j 10 block ::: id1 id2 id3 id4 ....
あなたのIDと交換してくださいidi
。または類似ファイル(SRR837459など)にIDがある場合
id1
id2
id3
次に、次の行を使用します(他の入力ソースがない場合、GNU Parallelは標準入力から読み取られます)。
parallel -j 10 block
スクリプトを実行して
bash script < idlist.txt