我是java的初学者和特定的文件。我有一个任务来计算文件中某个符号的出现次数,但我必须使用随机数量的线程。我的想法是将文件拆分为我必须使用的多个线程,将其添加到集合中,然后使用具有固定线程池的ExecutorService。但是我不确定如何将文件拆分成相同的大部分。我很感激任何提示!
答案 0 :(得分:0)
随机数的线程是什么意思?你的意思是cpu上可用的核心数量!或从函数中提取一个随机数并应用这么多线程!
我对解决这个问题的看法是
答案 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。文本 。然后,希望将文件读取并行化。
上面的代码仍然有效,但您提交文件编写任务,而不是提交计数任务。