当前位置 : 主页 > 编程语言 > c++ >

c – 处理时写入数据块 – 由于硬件限制,是否存在收敛值?

来源:互联网 收集:自由互联 发布时间:2021-06-23
我正在从一个大文件处理来自硬盘的数据(处理速度快,而且开销不大),然后必须将结果写回(数十万个文件). 我开始直接在文件中编写结果,一次一个,这是最慢的选项.我认为如果我构建一
我正在从一个大文件处理来自硬盘的数据(处理速度快,而且开销不大),然后必须将结果写回(数十万个文件).

我开始直接在文件中编写结果,一次一个,这是最慢的选项.我认为如果我构建一定数量的文件的向量然后立即写入它们会更快,然后返回处理,同时硬盘被写入我写入的所有内容(至少似乎是发生了什么).

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

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

或者这只是巧合?

我也会对有关如何优化写入性能的经验/经验法则感兴趣,例如更大的硬盘块有用,等等.

编辑:

硬件是一个非常标准的消费者驱动器(我是学生,而不是数据中心)WD 3,5 1TB / 7200 / 16MB / USB2,HFS记录,操作系统是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慢,后者比SATA慢.如果XFS写入许多小文件比ext2快得多,我不会感到惊讶.内核一直在变化.因此,这里有太多因素可以简化预测.

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

>将我的程序拆分为多个线程(甚至进程),并使用一个线程尽快提供打开,写入和关闭操作系统的系统调用.如果您可以使线程数成为运行时参数,则可以获得奖励积分.
>不要试图从硬件特性中估算性能,而是编写一个程序,尝试一系列替代方案,并在当天为您的特定硬件和软件组合找到最快的方案.将最快的替代品保存在文件中,甚至将其编译到代码中.这个策略是由Matteo Frigo在FFTW开创的,它非常有效.

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

网友评论