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

同样如果在面试中问你这个问题该怎么回答呢?假设有一个文件大小为10G,我们需要将其读取到内存中(假设内存能容纳下该文件),那么使用多个线程分块去读取的话会加快读取速度吗,比如我们创建两个线程,一个线程读取前5G数据;另一个线程读取后5G数据,这会比只是用一个线程将其读入内存快吗?
先说答案,对于机械磁盘,使用多个线程去读取文件通常是一个bad idea。

为什么?

为什么使用多个线程去读取文件通常是一个bad idea呢?
原因就在于虽然我们可以使用多个线程来充分利用多个CPU核心,但是不要忘了,磁盘只有一个。
因此简单的使用多个线程并不能加快文件的读取速度。这就好比一个餐馆,这个餐馆中有多个服务员,但是只有一个厨师;服务员下单很简单,即一句话的事儿,但是厨师做一道菜出来是需要很多时间的,一个服务员下的单就够厨师忙的了,多个服务员同时下单并不能提高厨师的产出。
在这里服务员就好比CPU,厨师就好比磁盘。
实际上使用多个线程来读取文件可能会使得情况更加糟糕,这就涉及到了对磁盘结构的理解。

理解磁盘

当然,这里的磁盘是指的机械磁盘,这类磁盘需要把磁头放到正确的磁道上,接着等待相应的扇区转到该磁头下才可以读取磁盘数据。
因此磁盘中最耗时的其实并不是把数据从磁盘读取到磁头,最耗时的其实是把磁头移动到正确的磁道上,这个步骤最耗时,有的同学可能会有疑问,为什么这个步骤是最耗时的呢?
不要忘了,我们说的是机械磁盘,磁头的移动相对电子的速度是极慢的,使用多个线程来读取文件的话,磁头可能要在不同的磁道间来回移动以满足各个线程的文件读取请求,这个过程对磁盘性能的影响是非常大的。
现在你该知道为什么多线程读取文件不会加快读取速度了吧。

最佳实践

理解了磁盘的原理之后我们就明白了,实际上磁盘的顺序读取才是最快速的,这就是为什么我们把2G的电影copy到磁盘的速度要远远快于把2G的多个文件copy到磁盘的速度快很多的原因。
因此比较好的办法就是使用一个线程来读取一个大文件,要想加快数据处理速度可以等文件读取完成后使用多个线程来处理这些已经加载到内存中的数据。

SSD磁盘

待续。。。

RAID10磁盘

待续。。。

总结

一个看似简单的问题其实往往并不是我们想的那么容易,这涉及到了对磁盘理解,只有对计算机各个系统有了一个透彻的理解后,解决问题才能从关键着手。

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

  1. win10搜索服务器文件慢,Win10系统怎么加快文件搜索速度

    Win10纯净版64位系统自带有文件搜索功能,这个功能可以快速查找硬盘中的文件,但是有些用户发现系统搜索文件的速度很慢,那么有什么办法可以加快文件搜索速度呢?针对这个问题,今天小编就来分享Win10系 ...

  2. python提高文件读取速度_Python提高了HDF5文件的读取速度

    我正在构建一个存储财务数据的数据库(特别是选项链) . 我每天检索每个交易日的数据,即5d /周或250d /年 . 我这样做了300个代码,数据库正在以150Mb /天的速度增长,到目前为止达到了9 ...

  3. Java第一次读文件慢_Java 关于文件读取速度问题,求助,谢谢啦

    展开全部 /** * ip条目实体类 */ public class IpEntry { String country, province, city, region, local; long sta ...

  4. linux传输文件特别慢,加快Linux文件拷贝速度的两大方法

    在进行Linux文件拷贝中,文件较多的时候拷贝的速度非常慢,那么有什么办法能够加快文件拷贝的速度呢?下面小编就给大家介绍下加快Linux文件拷贝速度的方法. 第一种方法 首先,无论本地还是远程,需要移 ...

  5. 小师妹学JavaIO之:文件读取那些事

    文章目录 简介 字符和字节 按字符读取的方式 按字节读取的方式 寻找出错的行数 总结 简介 小师妹最新对java IO中的reader和stream产生了一点点困惑,不知道到底该用哪一个才对,怎么读取 ...

  6. 极客评论:使用TeraCopy加快文件复制

    One of the biggest complaints about Vista has always been the speed problems when copying files, esp ...

  7. pandas将csv文件保存文feather格式,大大加快读取速度

    在参加各种机器学习比赛的时候,有时候要读取几百M甚至几个G 的表格数据,为了使读取速度加快,使用一种新的方法,把.csv格式格式的文件转存为.feather格式,再用read_feather读取,速度 ...

  8. 如何在 Windows 7 中使用多线程加快文件复制[转]

    为什么没办法在 Windows 7 下加快 Windows 7 中文件复制/传输功能呢?可以用 robocopy 实现多线程文件复制实现. 经常进行文件管理操作的朋友们,提到复制/粘贴操作,想必很多人 ...

  9. linux硬盘对拷慢,解决NTFS拷贝文件远比磁盘物理读取速度慢的问题

    问题 周末在Linux下搬运磁盘数据,发现一个很奇怪的现象.从通过ntfs-3g挂载的NTFS分区读取数据,写入到另外一个基于RAID1阵列的分区,理论上能到50MB/s+,实际上却只有20MB/s左 ...

最新文章

  1. Kmeans聚类算法分析(转帖)
  2. Leetcode 347. 前K个高频元素 解题思路及C++实现
  3. Python 技术篇-用flask服务实现mac本地文件上传至windows服务器指定文件夹下实例演示
  4. 带你攀顶云端高级认证,有这回事?
  5. Ubuntu 17.10安装phpMyAdmin数据库管理工具
  6. 很多想法、很多感慨。
  7. 推荐几个Android开发非常有用的工具(for android studio)
  8. 线程池,远没你想象的那么简单
  9. 网易云深度学习第一课第一周编程作业
  10. 面向搜索引擎的内容管理系统(CMS)设计
  11. 【KE特效仿制】假面骑士 EX-AID NCOP+无彩限的怪灵世界 NCOP
  12. SPSS常见数据分析方法比较汇总
  13. 金彩教育:提升产品标签的方法
  14. c语言贾宗璞答案,c语言程序设计答案贾宗璞 许合利
  15. JSP网站开发技术两种模式介绍
  16. vba更改计算机系统时间,如何设置系统日期,一行VBA编程代码教你学会
  17. 论文解读:SuperPoint: Self-Supervised Interest Point Detection and Description
  18. 浪潮信息服务器拆解,从容大气 浪潮英信NF8560M2服务器拆解
  19. Eclipse中outline的意思、和各种图标的含义
  20. 夺命雷公狗---linux NO:18 linux文本编辑器vi的使用

热门文章

  1. JavaScript如何获取/计算页面元素的offset?
  2. 此时无法停用连接。这个连接可能在用一个或多个不支持即插即用的协议,或者它是由其他用户或系统帐户初始化的。...
  3. 【分享】 自闭症儿童网络画展 - JS效果
  4. [ORGINAL]OOP Panel control design(based on web )
  5. 设计高效sql一般经验谈
  6. 在Linux上安装CHM查看工具
  7. php注册登录遍写入 遍验证,在文件指定行中写入内容的php...-自动注册登录验证机制的php代...-php中出现Undefined index报错的修复方法_169IT.COM...
  8. MPEG原理分析及MPEG音频编码器的调试
  9. HarmonyOS之深入解析线程管理
  10. 2019年第十届蓝桥杯 - 省赛 - C/C++大学C组 - D. 质数