代码之家  ›  专栏  ›  技术社区  ›  Michał Górny

什么posix\u fadvise()参数用于顺序文件写入?

  •  15
  • Michał Górny  · 技术社区  · 14 年前

    我正在开发一个应用程序,它可以按顺序写入一个大文件(并且根本不读取),我想使用 posix_fadvise()

    手册页中的功能描述表明,最合适的策略是 POSIX_FADV_SEQUENTIAL . 但是,Linux实现描述怀疑:

    在Linux下, POSIX_FADV_NORMAL 将readahead窗口设置为备份设备的默认大小; 比这个大一倍 POSIX_FADV_RANDOM 完全禁用文件预读。

    POSIX\U FADV\U顺序 或者更确切地说是使用 POSIX\U FADV\U随机

    其他的选择呢,比如 POSIX_FADV_NOREUSE 为了写作?

    3 回复  |  直到 11 年前
        1
  •  6
  •   Trixl    14 年前

    这完全取决于数据的时间位置。如果您的应用程序在编写之后不久就不需要这些数据,那么您可以使用 POSIX_FADV_NOREUSE O_DIRECT 标志来自 open() ).

        2
  •  41
  •   caf    8 年前

    posix_fadvise() 旗帜(例如 POSIX_FADV_SEQUENTIAL POSIX_FADV_RANDOM )是关于预读而不是写作的提示。

    here here

    • write() ;
    • 请求窗口外异步写N sync_file_range(..., SYNC_FILE_RANGE_WRITE)
    • sync_file_range(..., SYNC_FILE_RANGE_WAIT_BEFORE | SYNC_FILE_RANGE_WRITE | SYNC_FILE_RANGE_WAIT_AFTER)
    • posix_fadvise(..., POSIX_FADV_DONTNEED)

    这样,页面缓存中的数据量就不会超过两个窗口,但在填充下一部分时,内核仍会将页面缓存的一部分写入磁盘。

        3
  •  0
  •   nategoose    14 年前

    就写操作而言,我认为您可以依靠操作系统磁盘IO调度程序来做正确的事情。

    posix_fadvise 有没有专门给内核提示未来的文件使用模式内核还有其他数据可以帮助它。

    如果不打开文件进行读取,则只需要在部分写入块时读取它们。如果要将文件截断为0,则它甚至不必这样做(您说过要覆盖)。