V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
morefreeze
V2EX  ›  Linux

同一台机器,多个程序读同一块硬盘上的数据,相比一个程序依次读,会慢吗?

  •  
  •   morefreeze · 2016-08-15 19:20:33 +08:00 · 3637 次点击
    这是一个创建于 3024 天前的主题,其中的信息可能已经有所发展或是发生改变。

    比如 4 个程序(和 CPU 数相同)读同一块硬盘上的文件(文件名连续),文件都不相同,和一个程序依次读这些文件,最后时间谁多谁少呢?同时读的总时间为各程序的执行时间之和。假设内存足够。

    对硬盘底层并不了解,我想如果来回切读取的位置,那读头应该会频繁移动,反而将时间耗在随机寻址上,相比单个程序顺序读,要慢不少,是这样吗?如果是这样的话,那一台机器难免会多个程序同时运行,难免会同时读取(这就更不说写入了),那这很难协调让效率最大化了?

    第 1 条附言  ·  2016-08-16 13:29:24 +08:00
    补充下,文件行数是百万级,大小约百 M ,即每行几百字符。只考虑一行行读的情况。

    看了圈评论的意思,大致是说现代磁盘会有优化,即使来回寻道是存在的,并行的效率仍然是高于一个程序硬跑的是么。

    补充下我自己看到的一些事实,用 parallel -j 4 跑程序,用 time cmd 来计时, total 时间平均下来有 3 小时左右,也就是 0.75 小时每个程序。而单个程序跑一次平均时间约 1 小时。
    第 2 条附言  ·  2016-08-16 14:16:26 +08:00
    mdzz, 文件大小应该是上 G
    13 条回复    2016-08-16 19:28:46 +08:00
    zhicheng
        1
    zhicheng  
       2016-08-15 19:56:36 +08:00 via Android
    文件大,无所谓。文件小,多个快。
    如果文件远小于内存,只有读请求,来回 seek 影响不大。
    文件名不影响文件读取数度,但我猜你的意思是文件是顺序创建的。
    singser123
        2
    singser123  
       2016-08-15 21:40:46 +08:00 via Android
    现在的硬盘都支持 ncq 了,会对队列顺序重新排序使磁头移动距离最少
    loading
        3
    loading  
       2016-08-15 21:45:11 +08:00 via Android
    只有一个磁头,文件碎片造成性能下降就是体现之一
    em70
        4
    em70  
       2016-08-15 22:08:24 +08:00
    如果文件不大,可以在内存虚拟一个硬盘出来放里面,就不考虑这些问题了
    shijingshijing
        5
    shijingshijing  
       2016-08-15 22:34:16 +08:00
    机械硬盘都要移动磁头寻道的然后读取的,底层理论上是顺序读写的, ncq 的意义就是把多个不同的请求尽量合并在一次寻道来读取。
    kaneg
        6
    kaneg  
       2016-08-15 23:34:35 +08:00
    多个程序读多个文件和一个程序读多个文件对操作系统的系统调用来说都是一样的,本质上不会有差异的。
    pubby
        7
    pubby  
       2016-08-15 23:42:51 +08:00
    @singser123
    @shijingshijing 这个场景中, ncq 需要多程序读才可能有作用吧,如果一个程序读没有太多队列信息用来排序啊。
    billlee
        8
    billlee  
       2016-08-16 00:17:58 +08:00
    不要把精力花费在无意义的优化上
    9hills
        9
    9hills  
       2016-08-16 08:05:22 +08:00 via iPhone
    @pubby 文件本身并不一定是连续存储的
    pubby
        10
    pubby  
       2016-08-16 08:19:26 +08:00 via Android
    @9hills 是的。但是一个程序总要按文件实际的存储位置依次顺序读下去,我的疑问是,我还没读到后面, ncq 怎能能知道我后续的磁头定位信息?
    murmur
        11
    murmur  
       2016-08-16 08:36:45 +08:00
    不要把操作系统当弱智好吧。。
    wizardoz
        12
    wizardoz  
       2016-08-16 09:34:42 +08:00
    你这个问题相当于这样:
    要读取磁盘上的多个文件,让操作系统优化读取过程相比于自己写一个程序来读,会慢吗?
    ryd994
        13
    ryd994  
       2016-08-16 19:28:46 +08:00 via Android
    如果你需要更多性能, Linux 下可以调大 readahead 以及用 deadline scheduler ,据说 deadline 对某些情况有奇效
    Windows 不知道有什么可调整
    另外………上 SSD ,卍解
    @pubby 用 fadvise 或者异步 IO
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2732 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 15:22 · PVG 23:22 · LAX 07:22 · JFK 10:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.