免责声明:这可能是一个研究问题,因为我无法找到我想要的东西,而且它非常具体。
问题:我有一个自定义搜索应用程序,需要读取介于每个0.01MB到大约10.0MB之间的100K和10M文件。每个文件包含一个可以通过mmap直接作为数组加载的数组。我正在寻找一种解决方案,在需要之前将文件预取到RAM中,如果系统内存已满,则弹出已经处理过的文件。
我知道这听起来很像OS内存管理和memcached之类的东西。我实际上正在寻找的是像memcached这样的东西,它不返回键的字符串或值,而是返回所选数组的起始地址。另外,(这是一个不同的主题)我希望能够管理共享内存,使得CPU核心和RAM之间的距离在NUMA机器上最短。</ p>
我的问题是:“这样的工具/库是否已经存在?”
答案 0 :(得分:1)
答案 1 :(得分:0)
确实你有很多文件(也许有太多文件)。我希望你的文件系统足够好,或者它们在很多目录中。如果没有适当调整,有数百万个文件可能会成为一个问题(但我不会对此有所帮助)。
我不知道你的应用程序是否写入&amp;读取那么多文件。也许您可以考虑切换到DBMS或PostGresQL之类的快MySQL,或者也许您可以使用GDBM。
答案 2 :(得分:0)
我曾经为搜索引擎类应用程序做过这个。它使用了一个LRU链,它也可以通过file-id和内存地址IIRC寻址(通过哈希表)。在每次访问时, hot 项目都重新定位到LRU链的头部。当内存紧张(mmap 失败......)时,LRU链的尾部未映射。
这个方案的缺陷是程序可能会被页面故障阻止。由于它是单线程的,因此真的被阻止了。将其更改为多线程体系结构将涉及通过锁和信号量保护哈希和LRU结构。
之后,我意识到我正在做双缓冲:操作系统本身有一个完美的LRU磁盘缓冲机制,这可能比我的更聪明。只需打开()或mmap()每个请求上的每个文件只有一个sytemcall,并且(给定最近的活动)与缓冲层一样快,甚至更快。
使用DBMS:使用DBMS是一种简洁的设计,但是您只需要最少3次系统调用就可以获得第一个数据块。肯定会(总是)阻止。但它可以合理地用于多线程设计,并使您免于锁定和缓冲管理的痛苦。