【问题标题】:Writing to hard disk more efficiently更高效地写入硬盘
【发布时间】:2023-04-02 02:56:01
【问题描述】:

我正在使用 std::fstream 将图像流写入硬盘。由于大多数硬盘驱动器都有 32MB 的缓存,是创建一个缓冲区来累积高达 32MB 的图像数据然后写入磁盘更有效,还是将每个图像都写入磁盘效率更高?

【问题讨论】:

  • 我认为你会让缓存工作,而不必尝试“帮助”它。
  • 您的写入性能真的有问题吗?如果没有,为什么要麻烦?

标签: c++ hard-drive


【解决方案1】:

缓存用作读/写缓存,以缓解由于排队引起的问题......以下是我使用磁盘的经验:

  1. 如果磁盘不是 SSD,那么串行写入比查找文件要好。查找是 I/O 性能的杀手。
  2. 磁盘通常以扇区大小写入。扇区大小通常为 512b 或 4k(较新的磁盘)。尝试一次写入一个扇区的数据。
  3. 捆绑 I/O 总是比多个小型 I/O 快。原因很简单,因为磁盘上的处理器要刷新的队列较小。
  4. 无论你能凭记忆提供什么,都可以提供。仅在必要时使用磁盘。您始终可以在写入时执行修改/无效缓存条目,具体取决于您的可靠性策略。确保你不交换,所以你的内存缓存大小必须是合理的,开始。
  5. 如果您正在执行此 I/O 管理,请确保您没有使用操作系统页面缓存进行双重缓冲。 O_DIRECT 为此。
  6. 如果可靠性不是问题,请使用非阻塞。 O_NONBLOCK

【讨论】:

    【解决方案2】:

    系统的每个部分,从fstream 到磁盘驱动程序,都比您的应用程序更了解特定效率。

    如果你尝试过,你无法改进各种缓冲方案,所以不要打扰。

    【讨论】:

    • 这可能是真的,也可能不是。 fstream 非常通用,在特定用途中击败它应该不难。根据他的使用模式和系统,使用mmap(或其Windows 等效项)或对数据执行单个系统级别write 可能更快。 (Iostream 主要面向文本,而 IIUC,他正在编写二进制数据块。)
    • 我不反对。鉴于正在使用 fstream,它确实非常通用,并且在 ostream 缓冲、文件系统缓冲、磁盘操作排序、磁盘控制器行为和磁盘硬件技巧之间,添加另一层缓冲不太可能有帮助。这个问题有点缺乏,当然可以做得更好,但鉴于我们掌握的信息,物理延迟可能占主导地位。
    猜你喜欢
    • 2013-12-08
    • 2010-09-30
    • 2013-12-29
    • 2011-01-03
    • 1970-01-01
    • 1970-01-01
    • 2019-11-14
    • 2016-04-14
    • 2018-07-08
    相关资源
    最近更新 更多