13

我有一个只每周运行一次的 C 程序,并且只读取一次大量文件。由于 Linux 还会缓存所有读取的内容,因此它们会不必要地填满缓存,这会大大降低系统速度,除非它有 SSD 驱动器。

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

笔记:

磁盘缓存是指当您两次读取文件时,第二次是从 RAM 中读取,而不是从磁盘中读取。即,一旦从磁盘读取的数据将留在 RAM 中,因此后续读取同一文件将不需要从磁盘重新读取数据。

4

2 回答 2

10

我相信传递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 的有趣引用。

于 2013-03-07T08:14:05.470 回答
6

您可以使用posix_fadvise()POSIX_FADV_DONTNEED建议来请求系统释放您已阅读的页面。

于 2013-03-07T08:24:01.383 回答