同时读取多个文件是个好主意吗?

Is it a good idea to read multiple files at the same time?

我们公司的一台服务器有 32 个 CPU,我们有 1000 多个非常大的文件需要处理。我不确定同时读取 32 个文件是否是个好主意,这样所有内核也可以同时执行独立计算。谁能简单解释一下硬盘的工作原理?如果我同时读取32个文件,会不会降低读取速度?谢谢!

hard disk 传统上是一种机械数据存储设备。我假设服务器使用的是机械硬盘,而不是较新的 SSD 类型的硬盘,后者没有活动部件。我还假设有这么多数据和处理能力,同时使用多个硬盘(RAID 或 NAS)。这些细节会显着影响性能,并可能导致以下大部分内容不准确。

硬盘是一种机械设备,内部有一个旋转的圆盘(盘片),就像老式唱机或 CD 一样。它涂有磁性material,可以记录和播放微小的磁脉冲,很像录音带。一个可定位的“读写”磁头就在每个磁盘的表面上方飞行,通常在磁盘的两侧串联,随时准备在表面上移动以定位、读取和写入这些磁脉冲。旋转和运动都需要时间。给磁盘做的“工作”越多,完成所需的时间就越长,这仅仅是因为它必须在磁盘表面物理定位更多的微观区域。

就是说,假设您的老板希望所有员工阅读全部 29 卷大英百科全书并给出总结。每个卷存储在一个硬盘上,所以有 29 个硬盘。整篇文章有两种阅读方式:

  1. 拿起第 1 卷,让员工一次一页轮流阅读,直到读完本卷。重复直到完成所有卷。老板在处理所有页面时收集并重新排序,一次一卷。
  2. 员工同时拿起所有 29 卷,并尝试基本上随机阅读页面(净效应),直到所有卷都读完。老板收集并重新排序 29 个随机卷中的所有页面,因为它们正在处理...

选项 #1 似乎“过时”,但是关于此方法的一个重要事项是其他 28 个磁盘根本没有被使用。只有一个是。硬盘 far 顺序 读取数据方面比 随机 更好。这是因为顺序读取避免了读写头来回寻找造成的延迟。

选项 #2 可行,而且听起来很合理,但它并不理想,原因有二:a) 几乎没有顺序读取,以及 b) 所有磁盘都在使用中。这会消耗更多电量,并对服务器提出更大的要求,以同时 运行 所有这些磁盘。这样最终会花费 很多 的时间。

所以是的,如果您尝试同时处理 32 个大文件,那么这将给磁盘带来巨大的负载,并且它们可能会慢得像爬行一样。让 32 个内核一次“轮流”处理这些大文件中的一个,直到它们全部被处理为止,这更复杂,但可能是一个更好的解决方案。 (我所说的“轮流”是指将其分解成更小、更易于管理的块。)同样,目标是尽可能按顺序读取磁盘,并避免随机来回搜索。

完成此任务的软件必须是 multi-threaded,这意味着只有一个程序由用户启动,但它会为其他 CPU 核心创建 31 个新的“工作线程”。主程序开始按顺序读取数据,并将传入的数据拆分成块供其他线程(核心)处理。然后所有这些都“轮流”c运行处理整个数据文件的小块,直到它被完全处理。