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

Posted

技术标签:

【中文标题】同时读取多个文件是个好主意吗?【英文标题】:Is it a good idea to read multiple files at the same time? 【发布时间】:2015-04-21 07:17:48 【问题描述】:

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

【问题讨论】:

拥有 32 个 CPU 对磁盘速度没有影响。 你的意思是我读32个文件的时间不管是并行读还是串联读都一样?谢谢 【参考方案1】:

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

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

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

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

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

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

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

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

【讨论】:

以上是关于同时读取多个文件是个好主意吗?的主要内容,如果未能解决你的问题,请参考以下文章

在 Laravel 5 中动态编辑 .env 是个好主意吗?

为程序使用不同的 Python 脚本是个好主意吗? [关闭]

在 PHP mkdir 中使用模式 0664 是个好主意吗?

存储图形对象是个好主意吗?

使用触发器链接到数据仓库中事实表中的时间维度是个好主意吗?

软删除是个好主意吗? [复制]