V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
mortonnex
V2EX  ›  问与答

对于磁盘,为什么顺序写比随机写快?

  •  
  •   mortonnex · 2019-01-23 09:04:31 +08:00 · 6042 次点击
    这是一个创建于 2138 天前的主题,其中的信息可能已经有所发展或是发生改变。
    24 条回复    2019-01-24 08:53:41 +08:00
    jasonyang9
        1
    jasonyang9  
       2019-01-23 09:06:58 +08:00
    大概是寻道开销,错过目标扇区(块)的旋转开销
    yidinghe
        2
    yidinghe  
       2019-01-23 09:09:08 +08:00 via Android
    因为随机读写需要磁头重定位(寻道)啊,看看磁盘构造就知道。
    sagaxu
        3
    sagaxu  
       2019-01-23 09:10:32 +08:00 via Android
    ssd 也是顺序写快,RAM 也是顺序写快
    CallMeReznov
        4
    CallMeReznov  
       2019-01-23 09:11:51 +08:00   ❤️ 8
    楼主你手里有 3 页纸
    你看看你是一行一行按照顺序写快还是 3 张一个字换一页速度快?
    你脑子指挥手臂运动 抬手 落笔的这段时间 就是寻道时间
    liuxey
        5
    liuxey  
       2019-01-23 09:16:01 +08:00
    磁盘是机械结构,速度再快也无法突破物理限制,在随机读写方面是指数级的下降

    ssd 随机也不如顺序,但也没有磁盘那么明显
    tony1016
        6
    tony1016  
       2019-01-23 09:21:28 +08:00
    这问题问的……
    refugeezhao2018
        7
    refugeezhao2018  
       2019-01-23 09:49:55 +08:00 via Android   ❤️ 1
    这位是不懂技术的那位亲戚吧,怎么介绍来 v 站了
    nekoneko
        8
    nekoneko  
       2019-01-23 10:04:54 +08:00
    吃面条是一根一根吃得快还是随机抓一根咬一口吃得快?
    zacharyjia
        9
    zacharyjia  
       2019-01-23 10:08:52 +08:00
    除了上面各位说到的寻道开销之外,应该还有预读取缓存的影响。一般硬盘读取都是指定位置之后,一下子读取这附近挺大的一块数据放到缓存里的,如果是顺序读取的话,可能第二次就直接命中缓存从缓存里拿了,速度快得多。随机的话每次都要重新寻道查找。
    ThomasZ
        10
    ThomasZ  
       2019-01-23 10:30:55 +08:00 via Android
    要求你把手中的颜色快放在相同颜色的区域,给你连续的同一颜色放,比给你随机的颜色要快一样,机械硬盘要寻找写入数据的对应区块,随机写入,那它每次就要做寻道操作,连续写入就不用每次都做这个操作
    wysnylc
        11
    wysnylc  
       2019-01-23 10:30:58 +08:00
    顺序肯定比随机快啊这不是常识?
    Kagari
        12
    Kagari  
       2019-01-23 10:35:15 +08:00
    看来磁带也没有用过
    tianyou666shen
        13
    tianyou666shen  
       2019-01-23 11:11:21 +08:00
    实践
    - 随机读写 Vs 顺序读写
    - 运用顺序读写提高运行速度
    深入理解
    - 磁盘是如何存储书数据
    - 磁盘是如何读取数据的
    - 读数据的优化方案-缓存
    - 随机读取发生了什么
    - 顺序读取发生了什么
    - 顺序读取比随机读取快在哪里
    验证原理
    - 实验方案 是否花费时间在寻址阶段
    - 实验方案 是否使用了缓存

    看到这个问题,感觉国外一些比较好的技术书 会用这种循序渐进的方式帮助你理解这个问题 但是我目前也没看过 也懒得补充了 你先看个目录 查查资料 说不定自己就研究懂了呢 (要是写了博客 发上来我学习一下)
    scusjs
        14
    scusjs  
       2019-01-23 11:15:07 +08:00
    http://bfy.tw/LvNh
    自己去搜一下 /翻翻书 ✘
    来 V2EX 发个问题 √
    jasonyang9
        15
    jasonyang9  
       2019-01-23 11:40:53 +08:00
    如果写入缓冲足够大,这个差异会减小
    ghiei9101
        16
    ghiei9101  
       2019-01-23 11:46:54 +08:00
    机械这个问题很明显 主要是寻址耗时
    quinoa42
        17
    quinoa42  
       2019-01-23 11:51:39 +08:00
    最大的影响在于多层的缓存,包括通常意义上的 cache 和 PAGE
    硬盘读取速度和内存差了几个 0,更不要说 cache 了
    111qqz
        18
    111qqz  
       2019-01-23 12:00:58 +08:00 via Android
    找本 OS 书看看吧,文件系统部分
    wplct
        19
    wplct  
       2019-01-23 12:59:43 +08:00
    作者:Qilan Yuan
    链接: https://www.zhihu.com/question/26028619/answer/32932317
    来源:知乎
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    这个问题要分情况讨论:在机械硬盘上写还是在固态硬盘上写。尽管结论都是顺序写比随机写快,但是原因却是不一样的。首先说机械硬盘,我先介绍一下它的存储原理。机械硬盘的结构你可以想象成一个唱片机,它有一个旋转的盘片和一个能沿半径方向移动的磁头。处理读取和写入请求时,首先可以根据请求的开始地址算出要处理的数据在磁盘上的位置,之后要进行以下几步工作:1、磁头沿半径方向移动,直至移动到数据所在的柱面(相同半径的磁道组成的环面) 2、盘片高速旋转,使磁头到达数据的起始位置 3、磁头沿磁道从磁盘读取或写入数据当一次读取的数据量很少的时候,1、2 步骤带来的开销是无法忽略的,这使得随机写相对于顺序写会有巨大的性能劣势。因为在顺序写的时候,1、2 步骤只需要执行一次,剩下的全是数据传输所需要的固有开销;而每次随机写的时候,前两个步骤都需要执行,带来了极大的额外开销。其次说固态硬盘。理论上来说,它不应该存在明显的随机写与顺序写的速度差异,因为它就是一块支持随机寻址的存储芯片,没有寻道和旋转盘片的开销,但是随机写实际上还是比顺序写要慢。这是由于其存储介质闪存的一些特性导致的,简单来说:1、闪存不支持 in-place update:你更新一个数据,不可以直接在原有数据上改,而要写到新的空白的地方,并把原有数据标记为失效。2、标记失效的数据不是浪费空间么?可以将其清除。但是闪存上清除操作的最小单位是一个大块,大约 128K-256K 的大小。一次清除会影响到还未标记失效的有用的数据,要先把它们移走。这种感觉就如同你在网格纸上写一篇文章,一格一格往下写,只能写在空白的格子里;但是你若要清除之前写的内容,只能整行擦除。非常难受而且浪费空间对吧?所以固态硬盘里实现了垃圾回收算法,用来更好地利用存储空间,同时减少数据迁移,保护闪存寿命。那么随机写显然比顺序写带来更大的碎片化,从而带来更多的垃圾回收开销、数据迁移开销,自然就比顺序写要慢了。


    http://bfy.tw/LvNh
    自己去搜一下 /翻翻书 ✘
    来 V2EX 发个问题 √
    谷歌搜索第一个,
    zhouyut001
        20
    zhouyut001  
       2019-01-23 13:05:18 +08:00
    机械硬盘随机得寻道,固态随机和顺序差距没有机械那么大
    puritania
        21
    puritania  
       2019-01-23 13:07:40 +08:00 via iPhone
    借题问一下 一个不断间隔有写入的文件 读取的时候不是顺序读了吧?
    asyqm
        22
    asyqm  
       2019-01-24 00:39:26 +08:00
    @puritania 间隔是 0,读 0 也得读啊……所以还是顺序。
    puritania
        23
    puritania  
       2019-01-24 00:41:57 +08:00 via iPhone
    @asyqm #22 我的意思是 比如我每间隔一小时写入文件一段内容 那么这个文件在磁盘上应该不是连续存储的吧
    asyqm
        24
    asyqm  
       2019-01-24 08:53:41 +08:00
    @puritania 这个文件大概率就不是连续的了,但是对于你每次写入的部分,依然是顺序的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1070 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 18:55 · PVG 02:55 · LAX 10:55 · JFK 13:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.