使用多线程会加快文件读取速度吗?

前几天遇到一个颇有意思的问题,提炼出来就是使用多线程去读取文件的话会加快读取速度吗?程序员

在往下看以前先本身想想,一样若是在面试中问你这个问题该怎么回答呢?面试

假设有一个文件大小为10G,咱们须要将其读取到内存中(假设内存能容纳下该文件),那么使用多个线程分块去读取的话会加快读取速度吗,好比咱们建立两个线程,一个线程读取前5G数据;另外一个线程读取后5G数据,这会比只是用一个线程将其读入内存快吗?微信

先说答案,无论你使用的是什么语言,C/C++也好,Java、Python也罢,这个和语言无关,使用多个线程去读取文件一般是一个bad idea多线程

为何?ide

烧菜是须要时间的性能


为何使用多个线程去读取文件一般是一个bad idea呢?idea

缘由就在于虽然咱们可使用多个线程来充分利用多个CPU核心,可是不要忘了,磁盘就只有一个spa

所以简单的使用多个线程并不能加快文件的读取速度。这就比如一个餐馆,这个餐馆中有多个服务员,可是只有一个厨师;服务员下单很简单,即一句话的事儿,可是厨师作一道菜出来是须要不少时间的,一个服务员下的单就够厨师忙的了,多个服务员同时下单并不能提升厨师的产出。.net

在这里服务员就比如CPU,厨师就比如磁盘。线程

实际上使用多个线程来读取文件可能会使得状况更加糟糕,这就涉及到了对磁盘结构的理解。


理解磁盘

固然,这里的磁盘是指的机械磁盘,这类磁盘须要把磁头放到正确的磁道上,接着等待相应的扇区转到该磁头下才能够读取磁盘数据。

所以磁盘中最耗时的其实并非把数据从磁盘读取到磁头,最耗时的实际上是把磁头移动到正确的磁道上,这个步骤最耗时,有的同窗可能会有疑问,为何这个步骤是最耗时的呢?

不要忘了,咱们说的是机械磁盘,磁头的移动相对电子的速度是极慢的,使用多个线程来读取文件的话,磁头可能要在不一样的磁道间来回移动以知足各个线程的文件读取请求,这个过程对磁盘性能的影响是很是大的。

如今你该知道为何多线程读取文件不会加快读取速度了吧。


最佳实践

理解了磁盘的原理以后咱们就明白了,实际上磁盘的顺序读取才是最快速的,这就是为何咱们把2G电影copy到磁盘的速度要远远快于copy 2G的多个文件的缘由,由于一个电影文件做为总体可能顺序的放在磁盘当中,而多个文件会散落在磁盘的各个角落中。

所以比较好的办法就是使用一个线程来顺序读取一个大文件,要想加快数据处理速度能够等文件读取完成后使用多个线程来处理这些已经加载到内存中的数据。


总结

一个看似简单的问题其实每每并非咱们想的那么容易,这涉及到了对磁盘理解,只有对计算机各个系统有了一个透彻的理解后,解决问题才能从关键点着手,程序员也只有理解了底层才能设计出高性能程序。

本文分享自微信公众号 - 码农的荒岛求生(escape-it)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。

相关文章
相关标签/搜索