使用多线程会加快文件读取速度吗?
使用多线程去读取文件的话会加快读取速度吗同样如果在面试中问你这个问题该怎么回答呢假设有一个文件大小为10G我们需要将其读取到内存中假设内存能容纳下该文件那么使用多个线程分块去读取的话会加快读取速度吗比如我们创建两个线程一个线程读取前5G数据另一个线程读取后5G数据这会比只是用一个线程将其读入内存快吗先说答案对于机械磁盘使用多个线程去读取文件通常是一个bad idea。为什么为什么使用多个线程去读取文件通常是一个bad idea呢原因就在于虽然我们可以使用多个线程来充分利用多个CPU核心但是不要忘了磁盘只有一个。因此简单的使用多个线程并不能加快文件的读取速度。这就好比一个餐馆这个餐馆中有多个服务员但是只有一个厨师服务员下单很简单即一句话的事儿但是厨师做一道菜出来是需要很多时间的一个服务员下的单就够厨师忙的了多个服务员同时下单并不能提高厨师的产出。在这里服务员就好比CPU厨师就好比磁盘。实际上使用多个线程来读取文件可能会使得情况更加糟糕这就涉及到了对磁盘结构的理解。理解磁盘当然这里的磁盘是指的机械磁盘这类磁盘需要把磁头放到正确的磁道上接着等待相应的扇区转到该磁头下才可以读取磁盘数据。因此磁盘中最耗时的其实并不是把数据从磁盘读取到磁头最耗时的其实是把磁头移动到正确的磁道上这个步骤最耗时有的同学可能会有疑问为什么这个步骤是最耗时的呢不要忘了我们说的是机械磁盘磁头的移动相对电子的速度是极慢的使用多个线程来读取文件的话磁头可能要在不同的磁道间来回移动以满足各个线程的文件读取请求这个过程对磁盘性能的影响是非常大的。现在你该知道为什么多线程读取文件不会加快读取速度了吧。最佳实践理解了磁盘的原理之后我们就明白了实际上磁盘的顺序读取才是最快速的这就是为什么我们把2G的电影copy到磁盘的速度要远远快于把2G的多个文件copy到磁盘的速度快很多的原因。因此比较好的办法就是使用一个线程来读取一个大文件要想加快数据处理速度可以等文件读取完成后使用多个线程来处理这些已经加载到内存中的数据。SSD磁盘类似RAID10磁盘待续。。。总结一个看似简单的问题其实往往并不是我们想的那么容易这涉及到了对磁盘理解只有对计算机各个系统有了一个透彻的理解后解决问题才能从关键着手。方案把文件一次性读入内存再处理。