C 大文件内存管理
我正在寻求有关如何在我的库中透明、理智地访问大型(定义为:大于可寻址内存)文件/块设备的帮助。假设我们有一个32位架构的512GB块设备。512GB是我们在32位体系结构上无法解决的问题,使用C 大文件内存管理,c,file,memory,mmap,C,File,Memory,Mmap,我正在寻求有关如何在我的库中透明、理智地访问大型(定义为:大于可寻址内存)文件/块设备的帮助。假设我们有一个32位架构的512GB块设备。512GB是我们在32位体系结构上无法解决的问题,使用mmap()管理内存中的设备/文件部分是我试图避免的 我试图实现的是,获取以64位数字/偏移量寻址的块,这些块是任意的,但每个设备的大小是静态的(512字节、4K、8K、64MB等)。调用者应该只获取内存地址,不需要考虑释放内存或将实际内容加载到内存中 我在考虑一种机制,如下所示: 类似于void*get
mmap()
管理内存中的设备/文件部分是我试图避免的
我试图实现的是,获取以64位数字/偏移量寻址的块,这些块是任意的,但每个设备的大小是静态的(512字节、4K、8K、64MB等)。调用者应该只获取内存地址,不需要考虑释放内存或将实际内容加载到内存中
我在考虑一种机制,如下所示:
- 类似于
调用获取偏移量(块编号),检查此块是否已映射,如果未读取,则将其映射void*get\u file\u address(unit64\t blk\u offset)
- 跟踪块访问计数的一些结构(在每次
调用时更新)get\u file\u address
- 一种内存管理器,可在内存不足时使用,并使用前面提到的结构开始卸载很少使用的块
正如上面的链接所建议的那样,处理大型多媒体文件的软件源代码可能会有所帮助,它们的“框架”性质可能会导致一些有趣的片段。为什么不
mmap
只访问文件的特定部分,并按您所说的分块访问它mmap
支持偏移寻址,因此您可以以4K为单位遍历文件。@Nobilis因为如果我必须使用mmap,我也必须使用munmap-这是内存管理器的工作,我希望避免自己编写代码,因为这项工作似乎已经完成了:通过提供设备/文件+偏移量透明地获取内存地址。看起来您需要512GB的交换空间。。。我在开玩笑,伙计们…@Nobilis对不起,这个问题有点误导人,所以我现在编辑以更具体一些。谢谢你的意见@grasbueschel没问题,希望你遇到了你需要的东西,你可能是对的,有人已经为此做了某种包装:)