タイムスタンプや 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 日) になります。各ログ ファイル。そのため、大きなログ ファイルを壊すと、間隔の間に割り込む可能性があります。それが、ファイルの分割で直面している問題です。