2

我正在从事具有以下情况的 C/C++ 混合项目。

我需要进行迭代以逐个遍历文件中的非常小的块(也很少是较大的块)。理想情况下,我应该只连续阅读一次。我认为在这种情况下将一大块读入缓冲区并稍后使用它是一个更好的解决方案,而不是在我需要时立即读取它们中的每一个。

问题是,如何平衡缓存大小?有没有我可以利用的知名算法/库?


更新:(更改标题)

谢谢你们的回复,我知道我们的盒子里有不同级别的缓存机制。但就我而言,这还不够。

我想我在这里错过了一些重要的事情。实际上,我正在现有框架上构建一个应用程序,在该框架中,频繁地向引擎请求读取对我来说成本太高。(是的,我相信引擎确实利用了操作系统和磁盘级别的缓存。)我正在尝试做的确实是构建一个应用程序级别的预取系统。

想法?

4

2 回答 2

0

通常,您应该尝试使用操作系统为您提供的内容,而不是创建自己的缓存(因为您冒着缓存两次的风险)。对于 linux,您可以通过readahead()请求操作系统级别的缓存;我不知道 Windows 等效项是什么。

进一步研究,还有一个块级(即磁盘)参数,通过blockdev --setra设置。在您的系统上更改它可能不是一个好主意(除非它专门用于这一项任务),但如果那里的值(blockdev --getra)已经大于您的典型块大小,那么您可能不需要做还要别的吗。

[并且只是为了解决问题评论中提到的另一点-虽然操作系统会将文件数据缓存在可用内存中,但我不相信它会抢先读取其他未读文件(除了满足上述要求) . 但如果有人知道,请发布详细信息...]

于 2012-03-06T23:04:57.450 回答
0

您是否尝试过mmap()ing 文件而不是read()ing 文件?在某些情况下,这可能更有效,在某些情况下可能不会。然而,通常最好让系统为您优化,因为它比应用程序更了解硬件。mmap()会让系统知道您需要整个文件,因此它可能会更优化。

于 2012-03-08T19:27:09.400 回答