多个文件的多线程

时间:2014-11-22 20:26:23

标签: java multithreading

我有一个执行此算法的java程序:

Given a directory.
For each file in the directory.
    read each line
        process the line with regex and other string operation in addition to parsing
        write the line after processing to an output file

该目录有大约10个文件,大约有300万行。

由于正则表达式的复杂性,处理部分似乎是性能瓶颈,而解析部分则更慢。 因为我有一台功能强大的机器,有很多内存,并且咨询过" cat / proc / cpuinfo | grep处理器| wc -l"包含16个CPU。不要让这些参与进来会很难过。

我的想法是先将所有文件读入一个数组列表。然后将列表分成等于所需线程数的子数组列表。运行线程后,每个线程都用给定的子列表来做 处理部分同时并将输出保存到新的子数组中,最后应该合并并刷新到输出文件中。

这是解决这个问题的正确方法吗?

任何对其他类似作品的引用都将不胜感激。

非常感谢。

    String dir = "path/to/dir";
    File folder = new File(dir);
    if (folder.isDirectory()) {
        File[] listOfFiles = folder.listFiles();
        for (int i = 0; i < listOfFiles.length; i++) {
            File file = listOfFiles[i];
            if (file.isFile() && file.getName().contains("log")) {
                System.out.println("processing file: " + file);
                test.readFile(file);
            }
        }
    }
}

PrintWriter pw = new PrintWriter(new OutputStreamWriter(new FileOutputStream(output), StandardCharsets.UTF_8), true);
public void readFile(File file) {
    FileInputStream fis = null;
    BufferedReader br = null;
    String line;

    try {
        fis = new FileInputStream(file);
        br = new BufferedReader(new InputStreamReader(fis,
                Charset.forName("UTF-8")));
        while ((line = br.readLine()) != null) {
            String processedLine = processingLine(line);
            if (processedLine != null){
                pw.println(processedLine);
            }

        }

    } catch (IOException e) {

    }
}

public String processingLine(String line) {
    //regex
    //string operations
    //parsing text
}

1 个答案:

答案 0 :(得分:0)

  • 使用java.util.concurrency.Executors为每个文件处理生成子线程;
  • 使用同步队列收集结果;
  • 在单独的线程中处理收集的队列,将您的数据(安全和未损坏)写入输出。