1

読み取るファイルが 500 個ありますが、各ファイルを再帰的に読み取るには約 2 分かかります。そこで、Perlを使ってこの操作を並行して行いたいと考えています。どうやってやるの?

4

2 に答える 2

2

2分かかるとしたら、大量の読書について話している. 基本的に、ハードドライブを待つことに時間を費やしています。ファイルは別のハード ドライブにありますか? そうでない場合、同時に 2 番目のファイルを取得しようとした方が速くなると思うのはなぜですか? 実際、ハードドライブがシークする量が増えるため、動作が遅くなる可能性があります。

でも、どうしてもやってみたいという方は、

use threads;
use Thread::Queue qw( );

use constant NUM_WORKERS => 4;  # Twiddle this

sub run {
   my ($qfn) = @_;
   ...read file $qfn here...
}

my $q = Thread::Queue->new();

my @threads;
for (1..NUM_WORKERS) {
   push @threads, async {
      while (my $job = $q->dequeue()) {
         run($job);
      }
   };
}

$q->enqueue($_) for @qfns;

$q->enqueue(undef) for @threads;
$_->join() for @threads;
于 2013-05-10T05:18:30.463 に答える
0

罰金 1 件を処理する Perl スクリプトを作成します。batch-run.sh500 行 ( のような行) を含むシェル スクリプト を作成しますperl perl-script.pl file001。次に、から行を実行するために必要な数のバックグラウンド プロセスを起動する別のシェル スクリプトを作成しますbatch-run.sh。ただし、バックグラウンド プロセスの数を制限したい場合があります。このようなもの:

NCPUS=32 # number of parallel processes
ISCRIPT=batch-run.sh
NTASKS=$(wc -l $ISCRIPT | cut -d' ' -f1)

runbatch() {
    OFFSET=$1
    while [ $OFFSET -le $NTASKS ]; do
        CMD=$(sed "${OFFSET}q;d" $ISCRIPT)
        echo "$CMD ..."
        eval $CMD
        let OFFSET+=$NCPUS
    done
}

for i in $(seq 1 $NCPUS); do
    runbatch $i &
done
wait
于 2013-05-10T04:57:32.993 に答える