2014-10-18 86 views

回答

4

那么你会做什么,会是大致是这样的:

  1. 获取该文件的长度,
  2. 除以N.
  3. 创建N个线程
  4. 各有一个跳到(file_size/N) * thread_no和读(file_size/N)字节到缓冲区
  5. 等待所有线程合作mplete。
  6. 将缓冲区缝合在一起。

(如果你稍微聪明的话,你可能会避免最后一步......)

然而,值得怀疑的是,你会做这样得到太多的加速。事实上,如果你在很多情况下减速,我不会感到惊讶。对于典型的操作系统,我希望通过使用来自一个线程的一个大的read(...)调用来读取文件,您可以获得一样好的性能,如果不是更好的性能。

如果顺序读取数据,操作系统可以更快地从光盘读取数据。事实上,许多操作系统针对这种使用情况进行了优化,并使用预读和内存缓冲(使用OS级缓冲区)来提供高效的文件读取速率。

使用多个线程读取文件意味着每个线程通常会从文件中的不同位置读取数据。天真地说,这将需要操作系统在不同位置之间向后和向前寻找磁盘磁头......这将显着减慢I/O速度。实际上,操作系统会做各种事情来缓解这种情况,但即便如此,同时从磁盘上的不同位置读取数据仍然不利于I/O吞吐量。