1

タイムスタンプや URL などの取得を含むさまざまなログ ファイルを分析する必要があります。これにはマルチスレッドを使用しています。各スレッドは異なるログ ファイルにアクセスし、タスクを実行しています。それを行うためのプログラム:

public class checkMultithreadedThroughput{

    public static void main(String args[]){
        ArrayList<String> fileNames = new ArrayList<>();
        fileNames.add("log1");
        fileNames.add("log2");
        fileNames.add("log3");
        fileNames.add("log4");
        fileNames.add("log5");
        fileNames.add("log6");
        fileNames.add("log7");
        fileNames.add("log8");
        fileNames.add("log9");

        Thread[] threads = new Thread[fileNames.size()];

        try{
            for(int i=0; i<fileNames.size(); i++){
                    threads[i] = new MultithreadedThroughput(fileNames.get(i));
                    threads[i].start();
            }
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}

class MultithreadedThroughput extends Thread{

    String filename = null;
    MultithreadedThroughput(String filename){
        this.filename = filename;
    }

    public void run(){
       calculateThroughput();
    }

    public void calculateThroughput(){

        String line = null;
        BufferedReader br = null;
        try{
             br = new = new BufferedReader(new FileReader(new File(filename)));

            while((line = br.readLine())!=null){
                   //do the analysis on line 
            }
        }catch(Exception e){

            e.printStackTrace();
        }
    }
}

Thread を拡張する MultithreadedThroughput クラスで、BufferedReaderを使用してファイルを読み取っています。全体のプロセスには約 15 分かかります (ファイル サイズはそれぞれ約 2GB と大きくなります)。時間がかからないようにプログラムを最適化したい。

すべてのログ ファイルでスレッドを開始する代わりに私が考えた解決策は、一度に 1 つの大きなログ ファイルを取得し、大きなファイルをチャンク (プロセッサの数に等しいチャンクの数) に分割してから、それらのスレッドを開始するか、または他の解決策です。以前と同じプログラムを使用しますが、一度に 1 行ずつ読み取るのではなく、一度に複数行を読み取って分析を行います。しかし、私はそれらのどれも知りません。解決策を説明してください。

calculateThroughput メソッドでは、1 時間間隔で URL のスループットを推定する必要があります。したがって、プロセッサの数に応じてファイルを分割すると、1 つの間隔の間に分割される可能性があります。つまり、間隔が 06.00.00 から 07:00:00 (1 間隔) まで開始するとします。このように、24 間隔 (1 日) になります。各ログ ファイル。そのため、大きなログ ファイルを壊すと、間隔の間に割り込む可能性があります。それが、ファイルの分割で直面している問題です。

4

2 に答える 2

3

複数のスレッドに対して単一のファイルを分割しようとはしません。これによりオーバーヘッドが発生し、複数のファイルを並行して実行するよりも優れた方法はありません。

十分なバッファー サイズ (64k 以上など) で BufferedReader を作成します。最適はシステムに依存します - 実験する必要があります。後で(OP からのコメントにより:) バッファ サイズはアプリケーション ロジックには影響しません。データは行ごとに読み取られ、1 時間から次の時間へのステップは、行を次のバッチに持ち越すことによってとにかく処理する必要があります。

一度に複数行を読み取っても意味がありません。readLine はバッファから行をフェッチするだけです。

分析で時間を失っている可能性が非常に高いです。

于 2015-04-08T06:06:45.173 に答える
-1

プロセッサに十分なコアがない場合、スレッドを増やしても役に立たないため、仕事をより速く行うことはできないと思います。

于 2015-04-08T06:03:11.770 に答える