我有500个要读取的文件,但递归读取每个文件大约需要2分钟。所以我想使用Perl并行执行此操作。我怎么能这样做?
答案 0 :(得分: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;
答案 1 :(得分:0)
创建一个Perl脚本来处理单个罚款。创建一个包含500行(batch-run.sh
之类的行)的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