我有500個要讀取的文件,但遞歸讀取每個文件大約需要2分鐘。所以我想用Perl並行執行這個操作。我怎樣才能做到這一點?在Perl中以遞歸方式遞歸讀取文件
0
A
回答
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;
相關問題
- 1. perl遞歸文件讀取
- 2. 遞歸從.txt文件中讀取Java
- 3. 遞歸讀取目錄與文件夾
- 4. Perl遞歸幫助
- 5. 播放Json遞歸讀取
- 6. Python遞歸數據讀取
- 7. perl中的「遞歸」常量
- 8. Java中的遞歸遞歸
- 9. Java - SubSet和遞歸遞歸遞歸圖
- 10. 遞歸文件夾
- 11. 在遞歸方法
- 12. 以遞歸方式在文件上執行Maven命令
- 13. 遞歸以MIPS
- 14. 方案遞歸
- 15. 遞歸方法
- 16. 遞歸方法
- 17. 遞歸方法
- 18. Dos命令以遞歸方式僅格式化文件名
- 19. 取消遞歸
- 20. 以遞歸方式刪除屬性
- 21. 以遞歸方式運行tmutil'
- 22. 閱讀Python遞歸文件夾
- 23. 無法由Perl遞歸,而
- 24. 如何Perl遞歸正則表達式
- 25. asp.net mvc遞歸html遞歸
- 26. 我如何遞歸遞歸?
- 27. 遞歸0s和1s遞歸
- 28. 遞歸回文
- 29. 遞歸讀取ZipFile不提取(Java)
- 30. 遞歸Ruby中 - 迴歸方法本身
你可能會想在'fork'及其後果閱讀起來。 – tadman 2013-05-10 04:47:43
我不認爲你的意思*「遞歸」*。我無法想象遞歸文件讀取可能是什麼。也許你的意思是「順序」*? – Borodin 2013-10-03 12:07:30