2013-05-10 61 views
0

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

+0

你可能会想在'fork'及其后果阅读起来。 – tadman 2013-05-10 04:47:43

+0

我不认为你的意思*“递归”*。我无法想象递归文件读取可能是什么。也许你的意思是“顺序”*? – Borodin 2013-10-03 12:07:30

回答

0

创建一个Perl脚本来处理一个罚款。创建一个shell脚本,batch-run.sh,其中包含500行(行像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 
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;