0

私の入力ファイル(〜5k行)の形式は次のようになります

foo0: users/user1/temp1 users/user2/temp1 4.0
foo1: users/user2/temp1 users/user4/temp2 users/user4/temp1 1.0
foo2: users/user1/temp3 users/user2/temp3 2.0
foo4: users/user4/temp5 users/user2/temp6 users/user1/temp1 users/user3/temp1 4.0

私のスクリプトが行う必要があるのは、各行を見て、各パスを取得し、ファイルを開いて、それに基づいて内部の何かをチェックすることです。

例: 1 行目では、スクリプトはuser1 .txt を開き、user1.txt 内で temp1 を検索して何かを実行する必要があります。次に、user2 .txt に移動し、内部で temp1 を探して何かを行います。

2 行目: users2 .txt を開き、temp1 を検索します。users4 .txt を開き、temp2 を検索します。users4 .txt を開き、temp1 を検索します。

それについて行くための最も速い方法は何ですか。現在、1つずつ開いたり閉じたりしていますが、時間がかかりそうです。どんな助けでも感謝します、ありがとう!

4

2 に答える 2

-1

私はこのようなことをします:

#! /usr/bin/perl

use warnings;
use strict;

while ( <> ) { 

    ## Remove last newline character.
    chomp;

    ## Split line with spaces and save paths (all strings but the first and
    ## last one).
    my @paths = split;
    @paths = @paths[ 1 .. $#paths - 1 ];

    ## For each path...
    for my $path ( @paths ) { 

        ## Split with a slash, get second field and try to open it. 
        my @elements = split m|/|, $path;
        open my $fh, q|<|, $elements[1] or die $!; 

        ## Read line by line searching for the third field of the path, do
        ## something if found. You can add a 'last' instruction if you wish.
        while ( my $line = <$fh> ) { 
            chomp;
            if ( $line =~ m/\Q${elements[2]}\E/ ) { 
                ## Do something;
            }   
        }   

        close $fh or warn $!; 
    }   
}
于 2012-08-21T21:48:48.757 に答える
-2

通常のシステムでは、ハードディスクのデータ転送速度が限界です。しかし、あなたに優位性を与える方法があります:

マルチスレッド

このプログラムの実行中に HDD がアイドル状態になる可能性がある場合、または複数の物理ドライブからデータを読み取る場合は、マルチスレッドを試してください。これにより、プログラムの実行が遅くなる可能あることに注意してください

  1. 関数でnパイプを開きます。ここで、 nはスレッドの数です。pipe
  2. fork メイン (" Boss ") スレッド からn回。
    1. 各ワーカー スレッドは、関連のないすべてのパイプを閉じます
  3. Boss スレッドは入力ファイルを読み取り、各コマンドを別のプロセスにパイプします。こうすることで、すべてのワーカー プロセスのワークロードが等しくなります。
  4. ワーカー スレッドは検索などを行います。

以前にマルチスレッドを行ったことがない場合fork、このソリューションは機能しません。

そして、前述のように、各ファイルの計算が高価な場合 (計算/検索を行う時間が読み取りに費やされる時間に匹敵する場合)を除いて、これが肯定的な結果を引き起こす可能性はやや低いです。プロセッサ、これは役立つかもしれません。

より良いアルゴリズムを考え出す

  • 各ファイルで何をどのように検索しますか? 各行に対して単一の正規表現を照合してから、コードを実行しますか? 何のコード?正規表現が複雑すぎませんか?
  • ヒューリスティックを使用して、ファイルの特定の部分をスキップできますか?
  • 試しましたTie::Fileか?これにより、ファイルがメモリにロードされるのを回避できます。
  • スクリプトのベンチマークを行いましたか? 紹介については、 perl.comのこのチュートリアルを参照してください。どの部分が遅くなりますか?
  • プログラムのアルゴリズムの複雑さを軽減できますか? つまり、任意のファイルを 2 回繰り返していますか? それは最適ではないかもしれません。
于 2012-08-21T21:58:23.810 に答える