我必须分析不同的日志文件,包括检索时间戳、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)。我想以这样一种方式优化程序,使其花费更少的时间。
我认为的解决方案不是在所有日志文件上启动线程,而是一次获取一个大日志文件,将大文件分成块(块数等于处理器数),然后在它们上启动线程或其他解决方案拥有与以前相同的程序,但不是一次读取一行,而是一次读取多行并进行分析。但我不知道其中任何一个。请解释解决方案。
在 calculateThroughput 方法中,我必须以每小时为间隔估计 URL 的吞吐量。所以假设如果我根据处理器的数量打破文件,那么它可能会在一个间隔之间中断,即假设间隔从 06.00.00 到 07:00:00(一个间隔)像这样它们将是 24 个间隔(一天)每个日志文件。因此,如果我破坏了一个大的日志文件,它可能会在一个时间间隔之间中断,如果它这样做了,那么计算我将如何做的时间间隔。这就是我在拆分文件时面临的问题。