2013-05-10 98 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;