2012-03-06 78 views
2

我正在处理具有以下情况的C/C++混合项目。如何构建应用程序层预取系统

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

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


UPDATE:(将标题)

感谢你们的答复,我知道有我们盒的工作不同层次的缓存机制。但对我而言这还不够。

我想我错过了重要的东西在这里。实际上,我正在构建一个现有框架的应用程序,在这个框架中,对引擎的请求读取往往会花费太多。 (是的,我相信引擎确实会利用操作系统和磁盘级别的缓存。)我正在尝试构建一个应用程序级预取系统。

想法?

+0

这可能不值得担心,除非你有持续的阅读在所有地方进行。磁盘可以缓存大量数据;一般来说,我认为最高可达64 MB,而且它们的性能往往比您要求的高速缓存大得多。除此之外,我会建议提供一部分数据(可能是2或4 KB)。 – 2012-03-06 21:03:50

+1

现代操作系统使用所有可用内存作为磁盘缓存,而不仅仅是64MB。 – BatchyX 2012-03-06 21:17:36

+0

也许我应该说'磁盘缓冲区',我指的是硬盘中嵌入的硬件。 – 2012-03-06 21:20:30

回答

0

一般来说,您应该尝试使用操作系统为您提供的内容,而不是创建自己的缓存(因为存在两次缓存的风险)。对于Linux,您可以通过readahead()请求操作系统级缓存;我不知道相当于Windows的是什么。

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

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

+0

感谢您的答案。但是操作系统级别的缓存对我来说还不够,请参考我的问题更新。 – Reinhard 2012-03-07 23:12:11

+0

这就是你想要的东西 - http://dl.acm.org/citation.cfm?id=1251047(我通过搜索“预取内存管理启发式” - 我认为“缓存”是在这里没有帮助)。 – 2012-03-07 23:21:03

+0

谢谢!将对此进行研究并稍后再回来。 – Reinhard 2012-03-08 18:28:30

0

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

+0

其实我不是自己读文件,抱歉在这里误导你。请参阅我的更新 – Reinhard 2012-03-08 22:42:35

+0

@Reinhard问题:如果我理解正确,应用程序会将读取发送到框架,并且框架本身处理对数据的系统级访问权限?现在你想找到一个更好的方法来缓存来自框架的数据而不是系统本身?在这种情况下,我认为可以回答你的问题,因为这高度依赖于框架本身。你最好直接问好写这个框架的人来处理这个问题,因为他们是唯一能够在这里帮助你的人。 – LiKao 2012-03-09 11:46:44

相关问题