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)。我想以这样一种方式优化程序,使其花费更少的时间。

我认为的解决方案不是在所有日志文件上启动线程,而是一次获取一个大日志文件,将大文件分成块(块数等于处理器数),然后在它们上启动线程或其他解决方案拥有与以前相同的程序,但不是一次读取一行,而是一次读取多行并进行分析。但我不知道其中任何一个。请解释解决方案。

在 calculateThroughput 方法中,我必须以每小时为间隔估计 URL 的吞吐量。所以假设如果我根据处理器的数量打破文件,那么它可能会在一个间隔之间中断,即假设间隔从 06.00.00 到 07:00:00(一个间隔)像这样它们将是 24 个间隔(一天)每个日志文件。因此,如果我破坏了一个大的日志文件,它可能会在一个时间间隔之间中断,如果它这样做了,那么计算我将如何做的时间间隔。这就是我在拆分文件时面临的问题。

4

2 回答 2

3

我不会尝试为多个线程拆分单个文件。这将产生开销,并且不会比并行处理多个文件更好。

创建具有大量缓冲区大小的 BufferedReader,例如 64k 或更大。最佳值取决于系统 - 您必须进行试验。稍后(由于 OP 的评论:)缓冲区大小不会影响应用程序逻辑 - 数据是逐行读取的,并且从一小时到下一小时的步骤无论如何都必须通过将该行转移到下一批来处理。

一次读取几行是没有意义的 - readLine 只是从缓冲区中获取一行。

您很可能在分析中浪费时间。

于 2015-04-08T06:06:45.173 回答
-1

我认为您无法更快地完成这项工作,因为如果您的处理器没有足够的内核,更多的线程将无济于事。

于 2015-04-08T06:03:11.770 回答