使用multithreading读取单个文件:应该加快速度吗?

我正在读一个包含500000行的文件。 我正在测试看多个线程如何加快进程….

private void multiThreadRead(int num){ for(int i=1; i"+e.getMessage()); e.printStackTrace(); } } }; } private void sequentialRead(int num){ try{ long startTime = System.currentTimeMillis(); System.out.println("Start time:"+startTime); for(int i =0; i < num; i++){ RandomAccessFile raf = new RandomAccessFile("./src/test/test1.csv","r"); String line = ""; while((line = raf.readLine()) != null){ //System.out.println(line); } } long elapsedTime = System.currentTimeMillis() - startTime; String formattedTime = String.format("%d min, %d sec", TimeUnit.MILLISECONDS.toMinutes(elapsedTime), TimeUnit.MILLISECONDS.toSeconds(elapsedTime) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(elapsedTime)) ); System.out.println("Finished Time:"+formattedTime); } catch (Exception e) { e.printStackTrace(); // TODO: handle exception } } public TesterClass() { sequentialRead(1); this.multiThreadRead(1); } 

对于num = 1,我得到以下结果:

开始时间:1326224619049

完成时间:2分14秒

顺序读取ENDS ………..

multithreading读取开始:

来自线程号:1开始时间:1326224753606

从线号:1完成时间:2分13秒

multithreading读取ENDS …..

对于num = 5,我得到以下结果:

  formatted Time:10 min, 20 sec Sequential read ENDS........... Multi-Thread read starts: From Thread no:1 Start time:1326223509574 From Thread no:3 Start time:1326223509574 From Thread no:4 Start time:1326223509574 From Thread no:5 Start time:1326223509574 From Thread no:2 Start time:1326223509574 From Thread no:4 formatted Time:5 min, 54 sec From Thread no:2 formatted Time:6 min, 0 sec From Thread no:3 formatted Time:6 min, 7 sec From Thread no:5 formatted Time:6 min, 23 sec From Thread no:1 formatted Time:6 min, 23 sec Multi-Thread read ENDS..... 

我的问题是:不应该multithreading读取大约。 2.13秒? 您能解释为什么multithreading解决方案需要太长时间吗?

提前致谢。

由于文件读取主要是等待磁盘I / O,因此您遇到的问题是磁盘不会因为许multithreading使用它而旋转得更快:)

在并行读取时看到减速的原因是因为磁性硬盘磁头需要为每个线程寻找下一个读取位置 (大约需要5ms)。 因此,使用多个线程进行读取可有效地在搜索之间反弹磁盘 ,从而减慢速度。 从单个磁盘读取文件的唯一推荐方法是使用一个线程顺序读取。

从文件中读取是一个固有的串行过程,假设没有缓存,这意味着从文件中检索数据的速度有限。 即使没有文件锁(即打开文件只读),第一个之后的所有线程都会阻塞磁盘读取,这样你就可以让所有其他线程等待,而当数据变为可用时,哪个线程处于活动状态就是处理下一个街区。