拆分文本文件,然后使用部件,使用尽可能多的线程

时间:2016-09-06 11:15:45

标签: java file threadpool

我是java的初学者和特定的文件。我有一个任务来计算文件中某个符号的出现次数,但我必须使用随机数量的线程。我的想法是将文件拆分为我必须使用的多个线程,将其添加到集合中,然后使用具有固定线程池的ExecutorService。但是我不确定如何将文件拆分成相同的大部分。我很感激任何提示!

2 个答案:

答案 0 :(得分:0)

随机数的线程是什么意思?你的意思是cpu上可用的核心数量!或从函数中提取一个随机数并应用这么多线程!

我对解决这个问题的看法是

  1. 读入文件,然后遍历其内容,将它们存储在数组列表中。
  2. 根据您的随机数将数组列表拆分为数组或更小的数组列表。
  3. 创建随机数量的线程并将它们添加到线程池中。
  4. 将较小的数组/数组列表传递给线程,线程函数中的逻辑(如果是element.equals(符号){则计数})
  5. 每个帖子返回一个数字,添加这些数字,你就有了你的发生率。

答案 1 :(得分:0)

如何将文件拆分为相同的大部分

将实际的I / O读取拆分为多个线程并不合理,因为它可以更快地在单个线程中读取整个文件(更少的随机访问和争用)。 See this question for why

所以你应该简单地按顺序读取文件,按块分块,并在每次块大到足够时提交符号计数任务。

java.util.Scanner很好,因为它允许通过文件内容流式传输而不将其完全放在内存中,这对于大小超过RAM的文件很有用。

    StringBuffer chunk = new StringBuffer();
    try(FileInputStream inputStream = new FileInputStream("filename.txt");
        Scanner sc = new Scanner(inputStream, "UTF-8")) {

        while (sc.hasNextLine()) {

            chunk.append(sc.nextLine());
            if (chunk.length() > FILE_SIZE / THREAD_NB) {
                executorService.submit( () -> handleChunkSymbolCounting(chunk) );
                chunk = new StringBuffer();
            }
        }
    }

注意:如果您需要文件的物理拆分 ,即如果您要创建中间文件,如file001.txt,file002.txt ... fileXXX。文本 。然后,希望将文件读取并行化。

上面的代码仍然有效,但您提交文件编写任务,而不是提交计数任务。