Winapi 从缓存中读取文件,但不污染缓存(在Windows中)

Winapi 从缓存中读取文件,但不污染缓存(在Windows中),winapi,caching,file-io,Winapi,Caching,File Io,Windows有一个FILE\u标志\u NO\u BUFFERING标志,允许您指定是否希望文件系统缓存I/O 那很好,但是如果我希望尽可能使用缓存,但避免修改它呢 换句话说,您如何告诉Windows以下内容 如果此文件已缓存,请从缓存中读取它,但我的数据不显示位置,因此不要将其放入缓存中 SCSI标准定义了一个正好可以做到这一点的位,因此我想知道如何(如果有的话)从Windows使用该功能(当然,还需要文件系统缓存的配合) 编辑:TL;医生: 对于读取,与文件标志写入的等价物是什么?关于最

Windows有一个
FILE\u标志\u NO\u BUFFERING
标志,允许您指定是否希望文件系统缓存I/O

那很好,但是如果我希望尽可能使用缓存,但避免修改它呢

换句话说,您如何告诉Windows以下内容

如果此文件已缓存,请从缓存中读取它,但我的数据不显示位置,因此不要将其放入缓存中

SCSI标准定义了一个正好可以做到这一点的位,因此我想知道如何(如果有的话)从Windows使用该功能(当然,还需要文件系统缓存的配合)


编辑:TL;医生:


对于读取,与
文件标志
写入的等价物是什么?

关于最近的窗口为您所请求的内容提供的是
文件标志

关于最近的窗口为您所请求的内容提供的是
文件标志
写入

我看到两个看起来可疑的标志就像你所要求的:

FILE_FLAG_RANDOM_ACCESS
FILE_FLAG_SEQUENTIAL_SCAN
后者的文档清楚地表明它不会在缓存中保留页面,尽管它可能会按顺序提前读取。前者的文档完全不透明,但似乎暗示了你想要什么。如果模式是非常随机的,那么挂起页面以供以后重用将是对内存的浪费


请记住,对于文件,Windows内核总是使用一些“缓存”页面来保存I/O。它没有其他地方可以放置它。因此,说“不要缓存它”,而不是说“在逐出其他页面之前先逐出此文件的旧页面”,是没有意义的。

我看到两个标志看起来与您的要求很像:

FILE_FLAG_RANDOM_ACCESS
FILE_FLAG_SEQUENTIAL_SCAN
后者的文档清楚地表明它不会在缓存中保留页面,尽管它可能会按顺序提前读取。前者的文档完全不透明,但似乎暗示了你想要什么。如果模式是非常随机的,那么挂起页面以供以后重用将是对内存的浪费


请记住,对于文件,Windows内核总是使用一些“缓存”页面来保存I/O。它没有其他地方可以放置它。因此,说“不要缓存它”,而不是“在逐出其他页面之前先逐出此文件的旧页面”是没有意义的。

@Mehrdad:是的--这就是为什么我说它提供了最接近的页面,而不是说它真的是你想要的。@Mehrdad:是的--这就是为什么我说它提供了最接近的页面,而不是说它真的是你想要的。澄清一下,如果可能的话,您希望read使用缓存,但不希望read的结果被缓存(大概是为了避免抢占更多有用的数据)?@Heandel:目的正是@Phil所说的:在没有必要的情况下,防止其他数据被踢出缓存。为了澄清,您希望read在可能的情况下使用缓存,但是你不想缓存读取的结果(大概是为了避免抢占更有用的数据)?@Heandel:目的正是@Phil所说的:防止其他数据在不需要时被从缓存中踢出。这些并不是我想要的。它们关注的是预读行为,而不是缓存行为——前者指定不鼓励读ahead,后者指定鼓励读ahead,但两者都没有提到从缓存中逐出页面。该语言说它们应该优化您的案例。他们并没有说他们能用记忆做你想做的事,也没有说他们不能。如果没有内核开发人员的评论,我会尝试一下是否有你的问题。实际上我已经尝试过了——问题是它仍然会从缓存中逐出其他页面(因此,当我运行另一个程序时,我的硬盘会剧烈抖动),而
FILE\u NO\u INTERMEDIATE\u BUFFERING
根本不会影响其他程序。但当然,后者根本不使用缓存,这就是我的问题。哦,好吧,用黄鼠狼的话来捕捉一只有用的黄鼠狼就够了。这些并不能完全满足我的要求。它们关注的是预读行为,而不是缓存行为——前者指定不鼓励读ahead,后者指定鼓励读ahead,但两者都没有提到从缓存中逐出页面。该语言说它们应该优化您的案例。他们并没有说他们能用记忆做你想做的事,也没有说他们不能。如果没有内核开发人员的评论,我会尝试一下是否有你的问题。实际上我已经尝试过了——问题是它仍然会从缓存中逐出其他页面(因此,当我运行另一个程序时,我的硬盘会剧烈抖动),而
FILE\u NO\u INTERMEDIATE\u BUFFERING
根本不会影响其他程序。但当然,后者根本不使用缓存,因此我的问题是。哦,好吧,用黄鼠狼的话来捕捉一只有用的黄鼠狼就这么多了。