Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/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 使用NIO vs RandomAccessFile读取文件块_Java_Nio_Randomaccessfile - Fatal编程技术网

Java 使用NIO vs RandomAccessFile读取文件块

Java 使用NIO vs RandomAccessFile读取文件块,java,nio,randomaccessfile,Java,Nio,Randomaccessfile,我想读取一个关于几GB的大型文本文件,并在不加载整个文件的情况下对其进行处理,但加载其中的块(处理包括计算单词实例) 如果我使用并发哈希映射来并行处理文件以提高效率,有没有一种方法可以使用NIO或随机访问文件来分块读取它?这会使它更有效率吗 当前的实现使用的缓冲读取器如下所示: while(lines.size() <= numberOfLines && (line = bufferedReader.readLine()) != null) { lines.add

我想读取一个关于几GB的大型文本文件,并在不加载整个文件的情况下对其进行处理,但加载其中的块(处理包括计算单词实例)

如果我使用并发哈希映射来并行处理文件以提高效率,有没有一种方法可以使用NIO或随机访问文件来分块读取它?这会使它更有效率吗

当前的实现使用的缓冲读取器如下所示:

while(lines.size() <= numberOfLines && (line = bufferedReader.readLine()) != null) {
     lines.add(line);
}

lines.parallelStream().. // processing logic using ConcurrentHashMap

while(lines.size()显而易见的java 7解决方案是:

 String lines = Files.readAllLines(Paths.get("file"), StandardCharsets.UTF_8).reduce((a,b)->a+b);  

老实说,我不知道它是否更快,但我认为在引擎盖下,它不会将其读入缓冲区,因此至少在理论上它应该更快在文件中,你对你正在做的事情的描述听起来不是这样的。如果你必须处理大量并行通信,并且你想在套接字上执行非阻塞操作,那么NIO是有意义的。这似乎也不是你的用例

因此,我的建议是坚持在InputStreamReader(FileInputStream)之上使用BufferedReader的简单方法(不要使用FileReader,因为这不允许您指定要使用的字符集/编码)并按照您在示例代码中显示的方式查看数据。不要使用并行流,只有当您看到性能不好时,才可以尝试使用它


永远记住:过早优化是万恶之源。

下定决心吧。到底是NIO?还是
随机存取文件
?无论如何,使用
BufferedReader
每秒可以读取数百万行。使用NIO的速度不会超过20%,而使用
随机存取文件
的速度也会更慢没有缓冲:多线程可能会使它变得更糟,或者根本不做任何事情,因为磁盘不是多线程的。你真的需要这么做吗?我正在考虑更多的性能调整。所以当前的实现更有效?我会考虑更少的性能调整。只需逐行处理文件,忘记块块。d并行流。在我看来,我已经回答了你的最后一个问题。我当然试过了。是的,明白了。但是,如果文件对于RAM来说太大了,就必须进行分块,对吗?错。如果你一次处理一行,RAM的大小是无关紧要的,除非你有非常长的行。你猜错了。请参阅。我建议y您可以查找整个报价。您可能会得到一个惊喜。@EJP"程序员浪费大量时间考虑或担心其程序中非关键部分的速度,而在考虑调试和维护时,这些提高效率的尝试实际上会产生强烈的负面影响。我们应该忘记效率低的问题,比如说97%的时间:过早优化是最重要的但我们不应该错过这关键的3%的机会。“我在这里没有看到任何惊喜,至少我怀疑这个问题是否属于所提到的3%。