在Perl中并行递归读取文件

在Perl中并行递归读取文件,perl,Perl,我有500个要读取的文件,但是递归读取每个文件大约需要2分钟。因此,我想使用Perl并行执行此操作。我怎样才能做到这一点呢?创建一个Perl脚本来处理单个罚款。创建一个shell脚本,batch run.sh,其中包含500行(类似于perl-script.pl file001)。然后创建另一个shell脚本,该脚本启动所需数量的后台进程,以执行批处理run.sh中的行。不过,您可能希望限制后台进程的数量。大概是这样的: NCPUS=32 # number of parallel process

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

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

你说的是大量的阅读,如果需要两分钟的话。你基本上是在等硬盘。这些文件在不同的硬盘上吗?如果没有,为什么您认为同时获取第二个文件会更快?事实上,它可能会通过增加硬盘的搜索量来降低速度

但是如果你想试试的话

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;

你可能想读一下fork及其后果。我想你不是指“递归”。我无法想象递归文件读取可能是什么。也许你的意思是“按顺序”?