如何在 java 中使用多个线程从文件的不同部分读取它是否有效?
How to read from different sections of a file using multiple threads in java and will it be efficient?
我需要以高效的方式读取文件。
我会读取文件,读取文件中的每个单词都会查看自定义词典并确定文件中单词的偏移量。
我想出了以下解决方案
生产者线程
从文件中逐行读取并将每一行放入 ConcurrentHashMap。
消费者线程
从地图中读取行并在字典中查找单词。
我很确定实施消费者,但不确定使用线程读取文件是否有帮助。不确定使用 java IO 或 java NIO
更新了从文件更新读取到生产者映射的示例代码
public class DocumentManager {
Map<Location, String> map = null;
public DocumentManager(Map<Location, String> map) {
this.map = map;
}
public void readFile(String path) throws IOException{
BufferedReader bufferedReader = new BufferedReader(new FileReader(new File(path)));
String line = "";
while((line = bufferedReader.readLine()) != null){
map.put(new Location(0, 0), line);
//location is dummy at the moment
}
}
}
您可以在每个线程中使用 RandomAccessFile 来读取文件的不同部分。 RandomAccessFile 允许您从文件指针开始读取字节并将文件指针前进到读取的字节之后。
使用线程不是免费的,通过阻塞队列在线程之间传递对象的成本可能高得惊人。然而,更新地图虽然不是免费的,但比在线程之间传递工作要便宜得多。
您很可能会将大部分时间花在阅读和分析文件上。如果您有一个文本文件,则很难使用多个线程来执行此操作,并且比仅在一个线程中读取它更难使其更快。
我需要以高效的方式读取文件。
我会读取文件,读取文件中的每个单词都会查看自定义词典并确定文件中单词的偏移量。
我想出了以下解决方案
生产者线程
从文件中逐行读取并将每一行放入 ConcurrentHashMap。
消费者线程
从地图中读取行并在字典中查找单词。
我很确定实施消费者,但不确定使用线程读取文件是否有帮助。不确定使用 java IO 或 java NIO
更新了从文件更新读取到生产者映射的示例代码
public class DocumentManager {
Map<Location, String> map = null;
public DocumentManager(Map<Location, String> map) {
this.map = map;
}
public void readFile(String path) throws IOException{
BufferedReader bufferedReader = new BufferedReader(new FileReader(new File(path)));
String line = "";
while((line = bufferedReader.readLine()) != null){
map.put(new Location(0, 0), line);
//location is dummy at the moment
}
}
}
您可以在每个线程中使用 RandomAccessFile 来读取文件的不同部分。 RandomAccessFile 允许您从文件指针开始读取字节并将文件指针前进到读取的字节之后。
使用线程不是免费的,通过阻塞队列在线程之间传递对象的成本可能高得惊人。然而,更新地图虽然不是免费的,但比在线程之间传递工作要便宜得多。
您很可能会将大部分时间花在阅读和分析文件上。如果您有一个文本文件,则很难使用多个线程来执行此操作,并且比仅在一个线程中读取它更难使其更快。