首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >读取文件而不从OS页缓存中删除

读取文件而不从OS页缓存中删除
EN

Stack Overflow用户
提问于 2012-03-14 22:44:16
回答 4查看 1.6K关注 0票数 4

(这主要用于Linux,或者理想的任何POSIX系统。)

我正在寻找一种读取大量文件的方法(其中任何一个文件本身可能高达1GB ),具有以下特性:

  • 如果相关磁盘页已经在文件系统缓存中,则使用该页。
  • 如果相关页不在磁盘缓存中,则从磁盘中获取该页,但任何现有的缓存磁盘页都不会被逐出。

这样做的目的是能够读取所有这些文件,而不会污染磁盘缓存或取消当前工作集。

有指引吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-08-19 13:50:41

使用posix_fadvise,您可以提示操作系统应该从缓存中删除某些文件块。连同mincore的信息告诉我们当前正在缓存哪些块,我们可以更改应用程序以使其工作,而不会干扰缓冲区缓存。

对于未实现的内核特性,本文详细描述了这个令人愉快的解决方法:

http://insights.oetiker.ch/linux/fadvise/

内核预读的编辑含义

要获得完整的read性能,您应该确保只删除已经阅读过的页面。否则,您将删除内核预先读取的页面:)。(我认为这应该被认为是一种误判,这将使其失效,并至少避免大量浪费的IO。但是提前阅读是非常有帮助的,所以你要避免禁用它)。

另外,我敢打赌,如果你在上次阅读之前测试这些页面,那么它们总是显示为核心内容。它不会告诉你其他人是否在使用它们。它将显示内核预读正在工作:)。

链接的rsync修补程序中的代码应该很好(忽略“所有fds的数组”)。它在第一次读取之前测试整个文件。这是合理的,因为它只需要每4kB文件页的核心分配1字节。

票数 2
EN

Stack Overflow用户

发布于 2012-03-15 14:44:16

在Linux上,您可以使用O_DIRECT open()标志进行实验。man open(2)

代码语言:javascript
运行
复制
   O_DIRECT (Since Linux 2.4.10)
          Try  to minimize cache effects of the I/O to and from this file.
          In general this will degrade performance, but it  is  useful  in
          special  situations,  such  as  when  applications  do their own
          caching.  File I/O is done directly to/from user space  buffers.
          The O_DIRECT flag on its own makes at an effort to transfer data
          synchronously, but does not give the guarantees  of  the  O_SYNC
          that  data and necessary metadata are transferred.  To guarantee
          synchronous I/O the O_SYNC must be used in addition to O_DIRECT.
          See NOTES below for further discussion.
票数 4
EN

Stack Overflow用户

发布于 2012-03-20 03:15:07

最好的方法可能是使用posix_fadvise()。在读取之前,将POSIX_FADV_NOREUSE标志应用于整个文件似乎是最合适的;不幸的是,此标志对当前内核没有任何作用。

您可以尝试从文件中读取一块数据,然后立即告诉内核,您将不再需要带有POSIX_FADV_DONTNEED标志的块到fadvise()

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9711442

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档