我正在使用具有以下情况的C / C ++混合项目。
我需要一个迭代来逐个遍历文件中的非常小的块(很少更大的块)。理想情况下,我应该连续读一次。在这种情况下,我认为将更好的解决方案是将一个大块读入缓冲区并在以后使用它,而不是在需要时立即读取它们。
问题是,如何平衡缓存大小?有没有我可以利用的着名算法/库?
更新:(更改标题)
感谢各位回复,我知道我们的盒子中有不同级别的缓存机制。但在我的情况下这还不够。
我想我错过了一些重要的事情。实际上我正在一个现有的框架上构建一个应用程序,在这个框架中,请求读取引擎对我来说会花费太多。 (是的,我相信引擎确实利用了操作系统和磁盘级缓存。)而我正在尝试做的是构建一个应用程序级预取系统。
思想?
答案 0 :(得分:0)
一般来说,您应该尝试使用操作系统提供的功能,而不是创建自己的缓存(因为您有两次缓存的风险)。对于linux,您可以通过readahead()请求操作系统级缓存;我不知道窗户的等价物是什么。
再观察一下,还有一个块级(即磁盘)参数,通过blockdev --setra设置。在你的系统上更改它可能不是一个好主意(除非它专门用于这一个任务),但如果那里的值(blockdev --getra)已经大于你的典型块大小那么你可能不需要做别的什么。
[并且只是为了解决问题评论中提到的另一点 - 虽然操作系统会将文件数据缓存在空闲内存中,我不相信它会先发制人地读取其他未读取的文件(除了满足上述要求)。但如果有人不知道,请发布详细信息......]
答案 1 :(得分:0)
您是否尝试过mmap()
文件而不是read()
?在某些情况下,这可能更有效,在某些情况下可能不会。但是,通常最好让系统为您进行优化,因为它比应用程序更了解硬件。 mmap()
会让系统知道您需要整个文件,因此它可能更加优化。