2011-03-26 91 views
7

我目前每个内存块使用100兆字节来复制大文件。复制时使用的理想内存块大小是多少?

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

编辑

感谢所有伟大的响应。

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

+0

也许您的可执行文件比Windows复制文件具有更高的优先级。 – BenjaminB 2011-03-26 21:18:35

+1

如果你的操作系统提供了'statfs',那么你可以看看它建议的块大小('f_bsize'),尽管我不知道你能相信多远,它实际上是“最优”的。除非您真的担心在不同的平台和文件系统上会发生什么情况,否则请在您的机器上运行几个不同大小的测试,从非常小到非常大。使用更多的内存超过了停止变快的地步没有意义。 – 2011-03-26 23:11:02

+0

也考虑使用本机操作,例如Windows上的'CopyFile'。 – MSalters 2011-03-28 09:13:17

回答

9

4096和32KB之间的块是典型的选择。使用100MB会适得其反。你正在占用内存,缓冲区可以使用很多作为文件系统写回缓存。

当文件完全适合缓存时,复制文件非常快,WriteFile()调用是一个简单的内存到内存副本。缓存管理器然后懒洋洋地将它写出到磁盘。但是当缓存中没有更多空间时,当WriteFile()必须等待空间可用时,复制速度才会下降。它现在以磁盘写入速度进行。

0

我认为这取决于你有空闲内存的大小。

如果您在具有例如30Mb空内存的计算机上使用100 M块进行复制,则需要比使用较小(20M)块更多的时间进行复制。

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

+0

我不知道这是你的意思,但我检查文件大小是否大于100兆字节,如果不是,我只是使用确切的文件大小的块。 – 2011-03-26 21:21:39

0

这是一个相当多的数额。考虑到在读取100 MB之前你甚至没有开始写数据,所以文件系统驱动程序甚至没有机会在阅读时编写任何目标文件。在读取源文件时,磁盘可能会写入正好在磁头下传递的文件的部分(例如,请参阅elevator seek)。

2

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

假设你的操作系统是超级幼稚,每读或写操作招致硬盘寻求(在写入得到排队读练习,你会经常发现获得预读缓冲,减少使用大缓存的好处在您的应用程序代码中)。

然后每个块花费你(比如说)2x10ms用于两个搜索(一个读取和一个写入),一旦实际读取和写入的时间远远超过这个时间,则增加块大小的意义不大。一个非常快的HD可能会以150MB/s的速度读取和写入,在这种情况下,10ms将对应于1.5MB的读取/写入,而对于超过15MB的块大小,您将获得很少的收益。实际上,(1)你的寻找时间可能会更短,(2)你的读写带宽可能会更多,(3)你的操作系统和驱动器硬件可能会缓存和排队等待你的东西;你可能会看到从大于100KB以上的块大小中获益甚微。

(你或许应该基准多种块大小,看看你自己的系统是什么。)

5

我会建议你以此为基准,并记住包括更小的块大小。在我自己的测试中,我得到了很不直观的结果。

当从硬盘读取和写入数据时,512字节和512 kB之间的所有(两个幂的)块大小给出相同的速度。将块大小从512 kB增加到1 MB 减少了复制速度到约60%。增加块大小再次提高了速度,但从未回到使用小块的速度。

当所有复制的数据都在高速缓冲存储器中时,复制速度(快得多)随着块大小的增加而提高,在达到32kB块时变平滑,然后当从256 kB到512 kB块,永不回到以前的速度。

经过这个测试后,我在几个程序中将读/写块的大小从1 MB降到了32 kB。

+0

有一次(几年前),当我使用Flash文件系统在移动设备上进行了一系列测试时,写入速度一直保持在256K左右,尽管64K的回报递减很快。但是IIRC我只是测试从内存写入文件,而不是文件文件复制。而我们永远无法弄清楚这些尺寸的特别之处。 – 2011-03-26 23:15:16

0

鉴于驱动器必须在它改变磁道时进行寻道,可能不是块尺寸比如63 x 512 = 32256产生最佳结果?

+1

物理磁盘和程序之间有几层操作系统和硬件,所以磁盘磁道大小可能不重要。但是,欢迎来到SO :-)。 – thiton 2011-11-17 19:02:13