Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 拆分一个文本文件,然后使用部分,使用尽可能多的线程_Java_File_Threadpool - Fatal编程技术网

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

Java 拆分一个文本文件,然后使用部分,使用尽可能多的线程,java,file,threadpool,Java,File,Threadpool,我是java和特定领域文件的初学者。我有一项任务来计算文件中某个符号的出现次数,但我必须使用随机数目的线程。我的想法是将文件拆分为我必须使用的线程数,将其添加到集合中,然后使用带有固定线程池的ExecutorService。但我不知道如何将文件分割成同样大的部分。如果有任何提示,我将不胜感激 你所说的随机线程数是什么意思?你是说cpu上可用的内核数吗!或者从一个函数中抽取一个随机数并应用这么多线程 我对解决这个问题的看法是 读入文件,然后循环浏览其内容,并将其存储在数组列表中 根据随机数将数组列

我是java和特定领域文件的初学者。我有一项任务来计算文件中某个符号的出现次数,但我必须使用随机数目的线程。我的想法是将文件拆分为我必须使用的线程数,将其添加到集合中,然后使用带有固定线程池的ExecutorService。但我不知道如何将文件分割成同样大的部分。如果有任何提示,我将不胜感激

你所说的随机线程数是什么意思?你是说cpu上可用的内核数吗!或者从一个函数中抽取一个随机数并应用这么多线程

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

  • 读入文件,然后循环浏览其内容,并将其存储在数组列表中
  • 根据随机数将数组列表拆分为数组或更小的数组列表
  • 创建随机数目的线程并将其添加到线程池
  • 将较小的数组/数组列表传递给线程,线程函数中的逻辑(如果element.equals(symbol){then count})
  • 每个线程返回一个数字,将这些数字相加,就得到了发生率

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

    将实际的I/O读取拆分为几个线程是没有意义的,因为在单个线程中读取整个文件会更快(随机访问和争用更少)

    因此,您只需按顺序逐块读取文件,并在每次块足够大时提交一个符号计数任务

    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();
                }
            }
        }
    
    NB:如果您需要对文件进行物理拆分,即如果您想创建诸如file001.txt、file002.txt之类的中间文件。。。fileXXX.txt。然后,需要对文件读取进行并行化

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