gpt4 book ai didi

c++ - 在处理时写入数据 block - 由于硬件限制是否存在收敛值?

转载 作者:太空狗 更新时间:2023-10-29 20:19:09 25 4
gpt4 key购买 nike

我正在处理来自一个大文件的硬盘数据(处理速度很快而且开销不大),然后必须将结果写回(数十万个文件)。

我开始直接将结果写入文件,一次一个,这是最慢的选择。我认为如果我构建一定数量的文件的 vector 然后一次写入它们,然后在硬盘被占用写入我倒入其中的所有东西时返回处理,它会变得更快(那个至少看起来是这样)。

我的问题是,我能以某种方式估计我应该从硬件约束写入的数据量的收敛值吗?对我来说,这似乎是一个硬盘缓冲区的事情,我在那个硬盘上有 16MB 的缓冲区并获得这些值(全部用于 ~100000 个文件):

Buffer size      time (minutes)
------------------------------
no Buffer ~ 8:30
1 MB ~ 6:15
10 MB ~ 5:45
50 MB ~ 7:00

或者这只是巧合?

我也对一般如何优化写入性能的经验/经验法则感兴趣,例如,更大的硬盘 block 是否有帮助等。

编辑:

硬件是非常标准的消费驱动器(我是学生,不是数据中心)WD 3,5 1TB/7200/16MB/USB2,HFS+ journaled,操作系统是 MacOS 10.5。我很快就会在 Ext3/Linux 和内部磁盘而不是外部磁盘上尝试一下。

最佳答案

Can I somehow estimate a convergence value for the amount of data that I should write from the hardware constraints?

从长远来看不会。问题在于您的写入性能将在很大程度上取决于至少四件事:

  • 您正在使用哪个文件系统

  • 内核使用什么磁盘调度算法

  • 磁盘的硬件特性

  • 您正在使用的硬件互连

例如USB比IDE慢,IDE又比SATA慢。如果 XFS 在写入许多小文件方面比 ext2 快得多,我也不会感到惊讶。内核一直在变化。因此,这里的因素太多,无法轻松做出简单的预测。

如果我是你,我会采取以下两个步骤:

  • 将我的程序拆分为多个线程(甚至进程),并使用一个线程传递系统调用openwriteclose尽快到操作系统。如果您可以将线程数作为运行时参数,则可加分。

  • 与其尝试根据硬件特性来估计性能,不如编写一个程序来尝试一系列备选方案,并为当天的特定硬件和软件组合找到最快的一个。将最快的替代方案保存在文件中,甚至将其编译到您的代码中。该策略由 Matteo Frigo 为 FFTW 开创而且非常有效。

然后,当您更改磁盘、互连、内核或 CPU 时,您只需重新运行配置程序即可!您的代码将被优化以获得最佳性能。

关于c++ - 在处理时写入数据 block - 由于硬件限制是否存在收敛值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1989977/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com