【发布时间】:2013-09-01 18:31:44
【问题描述】:
我正在寻求有关如何在我的库中透明而健全地处理对大型(定义为:大于可寻址内存)文件/块设备的访问的帮助。假设我们在 32 位架构上有一个大小为 512GB 的块设备。 512GB 远远超出了我们在 32 位架构上的处理能力,并且使用 mmap() 管理内存中的设备/文件部分是我试图避免的事情。
我想要实现的是,获取被寻址为 64 位数字/偏移量的块,这些块是任意的,但每个设备的大小是静态的(512 字节、4K、8K、64MB 等)。调用者应该只获取内存地址,不需要关心释放内存或将实际内容加载到内存中。
我在想一个机制如下:
- 类似于
void* get_file_address(unit64_t blk_offset)调用,获取偏移量(块编号)并检查此块是否已映射,如果未读入,则对其进行映射 - 一些跟踪块访问计数的结构(在每次
get_file_address调用时更新) - 内存管理器可以在内存不足时使用,并使用前面提到的结构开始卸载很少使用的块
最后一点让我很恼火:我自己写一个内存管理器似乎并不理智。此外,我确信我不是第一个遇到这个问题的人。
那么,是否有任何解决方案/库/代码片段已经有助于管理此类或类似情况?我对 Win、Linux、*BSD 或 OS X 的解决方案没意见。
【问题讨论】:
-
您为什么不
mmap只访问文件的特定部分并按照您所说的分块访问它?mmap支持偏移寻址,因此您可以只遍历 4K 块中的文件。 -
@Nobilis 因为如果我必须使用 mmap,我也必须使用 munmap - 这是内存管理器的工作,我想避免自己编码,因为这项工作似乎是已经完成:通过提供设备/文件+偏移量透明地获取内存地址。
-
看起来你需要 512GB 的交换空间...我在开玩笑,天哪...
-
@Nobilis 抱歉,这个问题有点误导,所以我现在编辑得更具体。感谢您的意见!
-
@grasbueschel 没问题,希望你能找到你需要的东西,你可能是对的,有人已经为此做了某种包装:)