ファイルの読み取りと並列ジョブの実行

ファイルの読み取りと並列ジョブの実行

私がここでやっていることは少し複雑なので、理解できるほど十分に説明できることを願っています。 tldrバージョンは、ファイルから10行を読み取った後、そのファイルの入力に基づいてスクリプトを実行したいものです。完了すると、ファイルが完成するまで次のステップ10に進み、終了します。

これは長い話です。ニュースグループのいくつかのアーカイブを実行しようとしています。アーカイブしたい42227のニュースグループのリストがあります。私はUsenetサーバーから情報を抽出するためにsinntpアプリケーションを使用しています。 Pythonで書かれており、深刻なバグがあります。ニュースグループメッセージが失われると、再試行せずにコマンドが失敗します。

私の解決策はdownloader.shです。 sinntpが失敗すると、downloader.shは完了するまで強制的に再試行します。完了したら、永続保存のために出力ファイルの名前を変更して圧縮します(最終的にはarchive.orgに保存)。

ダウンローダ.sh:

#!/bin/bash

while getopts g: flag
do
    case "${flag}" in
        g) group=${OPTARG};;
    esac
done

downloader() {
nntp-pull $group
}

until downloader; do
    echo "restarting download" >&2
    sleep 1
done

if [ $? -eq 0 ]; then
    mv -v $group $group.mbox && zip -rm $group.mbox.zip $group.mbox
fi

今回は1つのニュースグループのみがダウンロードされます。また、メインニュースグループファイルを読み、downloader.shを並列に実行する2番目のスクリプトarchiver.shを作成しました。

アーカイバー.sh

#!/bin/bash

cat newsgroup_list_working.txt | parallel -j 10 ./downloader.sh -g {}

しかし、実際には動作しませんでした。複数回ダウンロードが中断され、新しいダウンロードは開始されません。ディスクやメモリが不足せず、CPU性能も100%ではありません。また、問題なく他のジョブを実行できるため、ディスクI / Oが最大値に達しません。ダウンロード速度が1MBが少し超えるほどなので、ネットワークには問題がないようです。

どんなアドバイスもありがとうございました!

答え1

コマンドごとに10個の引数を読み取ることができます。

cat file | parallel -N10 ./downloader.sh -g {5}

ここで、5はニュースグループ名を含む行です。

--dry-runGNU Parallelに実行するコマンドを表示するように指示します。

cat file | parallel --dry-run -N10 ./downloader.sh -g {5}

-j 300%正しいコマンドが表示されたら、各CPUスレッドが3つのジョブを並列に実行するように調整できます。

関連情報