【问题标题】:What is the ideal memory block size to use when copying?复制时使用的理想内存块大小是多少?
【发布时间】:2011-03-26 21:11:03
【问题描述】:

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

是否存在人们通常使用的“好”量?

编辑

感谢所有精彩的回复。

我对这些概念还是很陌生,所以我会尝试理解很多已经说过的概念(例如写回缓存)。我一直在学习新事物:)

【问题讨论】:

  • 也许您的可执行文件的优先级高于 Windows-copier。
  • 如果您的操作系统提供“statfs”,那么您可以查看它建议的块大小 (f_bsize),尽管我不知道您能相信它实际上是“最佳”的程度。除非你真的担心在不同的平台和文件系统上会发生什么,否则在你的机器上运行一些不同大小的测试,从非常小到非常大。超过停止速度的地步使用更多内存是没有意义的。
  • 也可以考虑使用原生操作,比如Windows上的CopyFile
  • @MSalters,如果我不想学习任何东西,我会考虑。

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


【解决方案1】:

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

当文件完全适合缓存时,复制文件非常快,WriteFile() 调用是简单的内存到内存复制。然后缓存管理器将其延迟写入磁盘。但是当缓存中没有更多空间时,当 WriteFile() 必须等待空间可用时,复制速度会急剧下降。它现在以磁盘写入速度运行。

【讨论】:

    【解决方案2】:

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

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

    当所有复制的数据都在缓存中时,复制速度(快得多)随着块大小的增加而提高,在达到 32 kB 块时趋于平缓,然后从 256 kB 突然下降到大约一半的速度到 512 kB 块,永远不会回到以前的速度。

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

    【讨论】:

    • 有一次(几年前),当我在使用 Flash 文件系统的移动设备上运行一系列测试时,写入速度一直提高到大约 256K 左右,尽管超过 64K 的回报非常递减。但是 IIRC 我只是在测试从内存到文件的写入,而不是文件到文件的复制。而且我们永远无法真正弄清楚这些尺寸有什么特别之处。
    【解决方案3】:

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

    假设您的操作系统非常简单,并且每次读取或写入操作都会导致硬盘寻道(在实践中,您经常会发现写入会排队,而读取会预先缓冲,从而降低了在您的应用程序代码)。

    然后每个块花费您(例如)2x10ms 进行两次查找(一次读取和一次写入),并且一旦实际读取和写入的时间大大超过此时间,增加块大小就没有什么意义了。一个非常快的 HD 可能以 150MB/s 的速度进行读写,在这种情况下,10ms 对应于 1.5MB 的读/写,而对于超过 15MB 的块大小,您将获得很少的收益。

    在实践中,(1) 您的寻道时间可能会更少,(2) 您的读写带宽可能会更多,以及 (3) 您的操作系统和驱动器硬件可能会为您缓存和排队;您可能会看到大约 100KB 以上的块大小几乎没有任何好处。

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

    【讨论】:

      【解决方案4】:

      这是一个相当多的数额。考虑到您甚至在读取 100 MB 之前都没有开始写入数据,因此文件系统驱动程序甚至没有机会在您读取时写入任何目标文件。磁盘可能正在写入文件的某些部分,而这些部分恰好在读取源文件时通过了头部(例如,参见 elevator seek)。

      【讨论】:

        【解决方案5】:

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

        如果您使用 100 M 块在具有例如 30Mb 空内存的机器上进行复制,那么复制将花费比使用较小 (20M) 块更多的时间。

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

        【讨论】:

        • 我不知道这是否是您的意思,但我会检查文件大小是否大于 100 兆字节,如果不是,我只使用与文件大小完全相同的块。跨度>
        【解决方案6】:

        鉴于驱动器在更改磁道时必须进行寻道,63 x 512 = 32256 的块大小可能不会产生最佳结果吗?

        【讨论】:

        • 物理磁盘和程序之间有几层操作系统和硬件,所以磁盘磁道大小可能并不重要。但是,欢迎来到 SO :-)。
        猜你喜欢
        • 2012-05-28
        • 1970-01-01
        • 2013-09-04
        • 2016-09-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-12
        • 1970-01-01
        相关资源
        最近更新 更多