在Linux中读取没有磁盘缓存的文件

sas*_*alm 9 linux io

我有一个只运行一周的C程序,只读取大量文件一次.由于Linux还会缓存所有已读取的内容,因此它们会不必要地填充缓存,除非它具有SSD驱动器,否则会大大减慢系统速度.

那么如何在不填满磁盘缓存的情况下打开和读取文件呢?

注意:

通过磁盘缓存我的意思是当你读取文件两次时,第二次从RAM读取,而不是从磁盘读取.即从磁盘读取的数据留在RAM中,因此后续读取同一文件不需要重新读取磁盘中的数据.

NPE*_*NPE 7

我相信,通过O_DIRECTopen()应该有所帮助:

O_DIRECT(自Linux 2.4.10起)

尝试最小化I/O与此文件之间的缓存效果.通常,这会降低性能,但在特殊情况下很有用,例如应用程序执行自己的缓存时.文件I/O直接进出用户空间缓冲区.O_DIRECT标志本身用于同步传输数据,但不保证O_SYNC传输数据和必要的元数据.为了保证同步I/O,除O_DIRECT外还必须使用O_SYNC.

关于手册页O_DIRECT底部的进一步详细说明,包括来自Linus的有趣引用.

  • @modifiablelvalue:这不是真的:你甚至不能使用`O_DIRECT`读取一个字符.在我链接到的手册页中详细介绍了这一点.只给出一个引用:*在Linux 2.4下,传输大小,用户缓冲区和文件偏移的对齐必须都是文件系统逻辑块大小的倍数.在Linux 2.6下,对齐到512字节边界就足够了.* (7认同)
  • IIRC,这将禁用预读,这可能是性能下降的原因 (4认同)
  • 可以肯定的是,因为它说"一般来说这会降低性能" - 它实际上不会对我降级,对吧?因为我真的只读一次文件. (2认同)

Has*_*kun 6

您可以使用posix_fadvise()POSIX_FADV_DONTNEED建议,要求系统释放您已经阅读网页.

  • 它可能会,但文件表明这是一个无操作. (4认同)
  • 谢谢。POSIX_FADV_NOREUSE 不是更合适吗?刚刚看了链接。 (2认同)
  • 您可以使用POSIX_FADV_NOREUSE _before_读取数据和POSIX_FADV_DONTNEED _after_读数.POSIX_FADV_NOREUSE目前是无操作的,但也许有一天会实现. (2认同)