1

我有 500 个要读取的文件,但递归读取每个文件大约需要 2 分钟。所以我想使用 Perl 并行执行此操作。我怎样才能做到这一点?

4

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

创建一个 Perl 脚本来处理单次罚款。创建一个batch-run.sh包含 500 行的 shell 脚本 (类似于 的行perl perl-script.pl file001)。然后创建另一个 shell 脚本来启动所需数量的后台进程来执行来自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 回答