我试图弄清楚当我们使用nio FileChannel与普通FileInputStream/FileOuputStream文件读取和写入文件系统时,性能(或优势)是否有任何差异.我观察到,在我的机器上,两者都在同一级别执行,也很多次FileChannel都是慢一些.我可以了解比较这两种方法的更多细节.这是我使用的代码,我正在测试的文件是350MB.如果我不是在查看随机访问或其他此类高级功能,那么对文件I/O使用基于NIO的类是一个不错的选择吗?
package trialjavaprograms;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
public class JavaNIOTest {
public static void main(String[] args) throws Exception {
useNormalIO();
useFileChannel();
}
private static void useNormalIO() throws Exception {
File file = new File("/home/developer/test.iso");
File oFile = new File("/home/developer/test2");
long time1 = System.currentTimeMillis();
InputStream is = new FileInputStream(file);
FileOutputStream fos = new FileOutputStream(oFile);
byte[] buf = new byte[64 * 1024];
int len = 0; …Run Code Online (Sandbox Code Playgroud) 我想尽快读取1 GB大文件的所有行Stream<String>.目前我正在使用Files(path).lines()它.在解析文件之后,我正在进行一些计算(map()/ filter())起初我认为这已经是并行完成了,但似乎我错了:当按原样读取文件时,我的双CPU需要大约50秒笔记本电脑.但是,如果我使用bash命令拆分文件然后并行处理它,它只需要大约30秒.
我尝试了以下组合:
Files(..).lines().parallel().[...]约50秒Files(..).lines().parallel().[...]约30秒我使用大致相同的结果(1或2秒)多次运行这4次.它[...]只是一个映射和过滤链,toArray(...)最后用于触发评估.
结论是使用没有区别lines().parallel().由于并行读取两个文件所需的时间较短,因此分割文件会带来性能提升.然而,似乎整个文件是连续读取的.
编辑:
我想指出我使用的是SSD,所以实际上是在寻找时间.该文件总共有1658652(相对较短)的行.在bash中拆分文件大约需要1.5秒:
time split -l 829326 file # 829326 = 1658652 / 2
split -l 829326 file 0,14s user 1,41s system 16% cpu 9,560 total
所以我的问题是,Java 8 JDK中是否有任何类或函数可以并行读取所有行而不必先拆分它?例如,如果我有两个CPU内核,则第一行读取器应从第一行开始,第二行应从第一行开始(totalLines/2)+1.
我有一个巨大的文件与字符串.所有行都应该添加到我的代码中的List中.什么是最快的方式?我发现了这个,但我不知道如何使用它来读取每行的行数.