并行磁盘 I/O

2024-05-25

我有几个想要阅读的日志文件。不失一般性,假设日志文件处理如下:

def process(infilepath):
    answer = 0
    with open (infilepath) as infile:
        for line in infile:
            if line.startswith(someStr):
                answer += 1
    return answer

由于我有很多日志文件,我想在这个问题上抛出多处理(我的第一个错误:我应该可能使用多线程;有人请告诉我为什么)

在这样做时,我突然想到,任何形式的并行处理在这里实际上都是无用的,因为我受到硬盘上只有一个读取头这一事实的限制,因此,一次只能读取一个文件。时间。事实上,根据这种推理,由于来自不同文件的行可能被同时请求,读头可能需要不时地显着移动,导致多进程方法比串行方法慢。所以我决定回到单个进程来读取我的日志文件。

但有趣的是,我注意到小文件 (= 445MB) 才注意到预期的速度下降。

这让我相信 python 可以分块读取文件,其大小超过我一次请求的一行。

Q1:那么什么是文件读取机制在引擎盖下?

Q2:优化从文件读取的最佳方法是什么传统硬盘?

技术规格:

  • python3.3
  • 5400rpm传统硬盘
  • Mac OSX 10.9.2(小牛队)

观察到的行为是由于:

  1. 缓冲IO
  2. 决定读取 HDD 必需扇区的顺序的调度算法

缓冲IO

根据操作系统和读取块大小,整个文件可能适合一个块,这是在单个读取命令中读取的内容。这就是为什么较小的文件更容易读取

调度算法

较大的文件(文件大小 > 读取块大小),必须读入block size大块。因此,当请求对多个文件中的每个文件进行读取时(由于多处理),指针必须移动到 HDD 的不同扇区(对应于文件所在的位置)。这种重复的动作有两件事:

  1. 增加连续读取同一文件的时间间隔
  2. 摆脱读取扇区预测器,因为一个文件可能跨越多个扇区

如果在读取头可以提供同一文件中的下一个行块之前完成对一个行块执行的计算,则同一文件的连续读取之间的时间很重要,该过程只需等待直到另一个行块变得可用。这是速度放缓的原因之一

放弃读取预测器是不好的,原因与为什么抛弃分支预测器是不好的 https://stackoverflow.com/a/11227902/198633.

由于这两个问题的综合影响,并行处理许多大文件会比串行处理它们慢。当然,处理的时候更是如此blockSize许多行之前完成numProcesses * blockSize可以从硬盘中读取很多行

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

并行磁盘 I/O 的相关文章

随机推荐