Find centralized, trusted content and collaborate around the technologies you use most.
Teams
Q&A for work
Connect and share knowledge within a single location that is structured and easy to search.
我有一个只每周运行一次的 C 程序,并且只读取一次大量文件。由于 Linux 还会缓存所有读取的内容,因此它们会不必要地填满缓存,这会大大降低系统速度,除非它有 SSD 驱动器。
那么如何在不填满磁盘缓存的情况下打开和读取文件呢?
笔记:
磁盘缓存是指当您两次读取文件时,第二次是从 RAM 中读取,而不是从磁盘中读取。即,一旦从磁盘读取的数据将留在 RAM 中,因此后续读取同一文件将不需要从磁盘重新读取数据。
我相信传递O_DIRECT给open()应该会有所帮助:
O_DIRECT
open()
O_DIRECT(自 Linux 2.4.10 起) 尽量减少进出该文件的 I/O 的缓存影响。一般来说,这会降低性能,但在特殊情况下很有用,例如当应用程序进行自己的缓存时。文件 I/O 直接与用户空间缓冲区进行。O_DIRECT 标志自己努力同步传输数据,但不保证 O_SYNC 传输数据和必要的元数据。为了保证同步 I/O,除了 O_DIRECT 之外,还必须使用 O_SYNC。
O_DIRECT(自 Linux 2.4.10 起)
尽量减少进出该文件的 I/O 的缓存影响。一般来说,这会降低性能,但在特殊情况下很有用,例如当应用程序进行自己的缓存时。文件 I/O 直接与用户空间缓冲区进行。O_DIRECT 标志自己努力同步传输数据,但不保证 O_SYNC 传输数据和必要的元数据。为了保证同步 I/O,除了 O_DIRECT 之外,还必须使用 O_SYNC。
手册页O_DIRECT底部有更详细的注释,包括来自 Linus 的有趣引用。
您可以使用posix_fadvise()该POSIX_FADV_DONTNEED建议来请求系统释放您已阅读的页面。
posix_fadvise()
POSIX_FADV_DONTNEED