复制时使用的理想内存块大小是多少?

时间:2011-03-26 21:11:03

标签: c++ file-io memory-management

我目前正在使用每个内存块100兆字节来复制大文件。

人们通常使用“好”的数量吗?

修改

感谢所有出色的回复。

我对这些概念还很陌生,所以我会尝试理解很多已经说过的概念(例如写回缓存)。我不断学习新东西:)

6 个答案:

答案 0 :(得分:9)

4096到32KB之间的块是典型的选择。使用100MB会适得其反。您正在使用缓冲区占用RAM,可以将很多更好地用作文件系统写回缓存。

当文件完全适合缓存时,复制文件非常快,WriteFile()调用是一个简单的内存到内存副本。然后缓存管理器懒洋洋地将其写入磁盘。但是当缓存中没有空间时,当WriteFile()必须等待空间可用时,复制速度会从悬崖上掉下来。它现在处于磁盘写入速度。

答案 1 :(得分:5)

我建议您对此进行基准测试,并记住要包含更多更小的块大小。在我自己的测试中,我得到了相当违反直觉的结果。

当从硬盘读取和写入时,512字节和512 kB之间的所有(2的幂)块大小给出相同的速度。将块大小从512 kB增加到1 MB 将复制速度降低到约60%。增加块大小会进一步提高速度,但永远不会一直回到使用小块的速度。

当所有复制的数据都在高速缓冲存储器中时,(更快)复制速度随着块大小的增加而提高,在达到32 kB块时变平,然后在从256 kB开始时突然降低到之前速度的一半左右到512 kB的块,永远不会恢复到以前的速度。

在此测试之后,我在几个程序中删除了大约1 MB到32 kB的读/写块大小。

答案 2 :(得分:2)

使用大块的块通常没什么好处。

假设您的操作系统非常幼稚,并且每次读取或写入操作都会产生硬盘搜索(实际上,您会经常发现写入排队并且读取会进行预读缓冲,从而降低了使用大缓冲区的好处你的申请代码)。

然后每个块花费你(例如)2x10ms进行两次搜索(一次读取,一次写入),并且一旦实际读取和写入的时间远远超过这个,就会增加块大小。一个非常快的高清可能会以150MB / s的速度进行读写,在这种情况下,10ms将对应1.5MB的读/写,而对于超过15MB的块大小,你的收益将会很少。

在实践中,(1)您的寻道时间可能会更短,(2)您的读写带宽可能更大,(3)您的操作系统和驱动器硬件可能会为您缓存和排队;你可能会看到块大小超过100KB的好处很少或根本没有。

(你应该对各种块大小进行基准测试,看看你在自己的系统上得到了什么。)

答案 3 :(得分:0)

我认为这取决于您拥有的可用内存大小。

如果您使用100 M块复制到具有30 Mb空存储器的机器上,则复制所需的时间比使用较小(20M)块需要更多时间。

如果您的复制buffor大于可用空闲内存的大小,那么由于虚拟内存交换,您的复制速度将比预期慢。

答案 4 :(得分:0)

这是一个非常过分的数额。考虑到在读取100 MB之前甚至没有开始写入数据,因此文件系统驱动程序甚至没有机会在您阅读时写入任何目标文件。当磁盘正在读取源文件时,磁盘可能正在写入碰巧在头下传递的文件部分(例如,参见elevator seek)。

答案 5 :(得分:0)

鉴于驱动器在更改轨道时必须寻找,可能不是块大小(例如63 x 512 = 32256)会产生最佳结果吗?