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