(这主要用于Linux,或者理想的任何POSIX系统。)
我正在寻找一种读取大量文件的方法(其中任何一个文件本身可能高达1GB ),具有以下特性:
这样做的目的是能够读取所有这些文件,而不会污染磁盘缓存或取消当前工作集。
有指引吗?
发布于 2015-08-19 13:50:41
使用posix_fadvise,您可以提示操作系统应该从缓存中删除某些文件块。连同mincore的信息告诉我们当前正在缓存哪些块,我们可以更改应用程序以使其工作,而不会干扰缓冲区缓存。
对于未实现的内核特性,本文详细描述了这个令人愉快的解决方法:
http://insights.oetiker.ch/linux/fadvise/
内核预读的编辑含义
要获得完整的read性能,您应该确保只删除已经阅读过的页面。否则,您将删除内核预先读取的页面:)。(我认为这应该被认为是一种误判,这将使其失效,并至少避免大量浪费的IO。但是提前阅读是非常有帮助的,所以你要避免禁用它)。
另外,我敢打赌,如果你在上次阅读之前测试这些页面,那么它们总是显示为核心内容。它不会告诉你其他人是否在使用它们。它将显示内核预读正在工作:)。
链接的rsync修补程序中的代码应该很好(忽略“所有fds的数组”)。它在第一次读取之前测试整个文件。这是合理的,因为它只需要每4kB文件页的核心分配1字节。
发布于 2012-03-15 14:44:16
在Linux上,您可以使用O_DIRECT
open()
标志进行实验。man open(2)
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.
发布于 2012-03-20 03:15:07
最好的方法可能是使用posix_fadvise()
。在读取之前,将POSIX_FADV_NOREUSE
标志应用于整个文件似乎是最合适的;不幸的是,此标志对当前内核没有任何作用。
您可以尝试从文件中读取一块数据,然后立即告诉内核,您将不再需要带有POSIX_FADV_DONTNEED
标志的块到fadvise()
。
https://stackoverflow.com/questions/9711442
复制相似问题