C 大文件内存管理

C 大文件内存管理,c,file,memory,mmap,C,File,Memory,Mmap,我正在寻求有关如何在我的库中透明、理智地访问大型(定义为:大于可寻址内存)文件/块设备的帮助。假设我们有一个32位架构的512GB块设备。512GB是我们在32位体系结构上无法解决的问题,使用mmap()管理内存中的设备/文件部分是我试图避免的 我试图实现的是,获取以64位数字/偏移量寻址的块,这些块是任意的,但每个设备的大小是静态的(512字节、4K、8K、64MB等)。调用者应该只获取内存地址,不需要考虑释放内存或将实际内容加载到内存中 我在考虑一种机制,如下所示: 类似于void*get

我正在寻求有关如何在我的库中透明、理智地访问大型(定义为:大于可寻址内存)文件/块设备的帮助。假设我们有一个32位架构的512GB块设备。512GB是我们在32位体系结构上无法解决的问题,使用
mmap()
管理内存中的设备/文件部分是我试图避免的

我试图实现的是,获取以64位数字/偏移量寻址的块,这些块是任意的,但每个设备的大小是静态的(512字节、4K、8K、64MB等)。调用者应该只获取内存地址,不需要考虑释放内存或将实际内容加载到内存中

我在考虑一种机制,如下所示:

  • 类似于
    void*get\u file\u address(unit64\t blk\u offset)
    调用获取偏移量(块编号),检查此块是否已映射,如果未读取,则将其映射
  • 跟踪块访问计数的一些结构(在每次
    get\u file\u address
    调用时更新)
  • 一种内存管理器,可在内存不足时使用,并使用前面提到的结构开始卸载很少使用的块
最后一点让我恼火:我自己写一个内存管理器似乎并不明智。此外,我确信我不是第一个遇到这个问题的人

那么,是否有任何解决方案/库/代码片段已经有助于管理此类或类似案例?我对Win、Linux、*BSD或OS X的解决方案没有意见。

我会使用“框架mmap”和“大文件支持”,这是Linux的一部分,从很久以前就开始了。 从文章开始,然后转到技术细节

网上也有一些答案。 我认为你不容易找到一些预先准备好的图书馆。
正如上面的链接所建议的那样,处理大型多媒体文件的软件源代码可能会有所帮助,它们的“框架”性质可能会导致一些有趣的片段。

为什么不
mmap
只访问文件的特定部分,并按您所说的分块访问它
mmap
支持偏移寻址,因此您可以以4K为单位遍历文件。@Nobilis因为如果我必须使用mmap,我也必须使用munmap-这是内存管理器的工作,我希望避免自己编写代码,因为这项工作似乎已经完成了:通过提供设备/文件+偏移量透明地获取内存地址。看起来您需要512GB的交换空间。。。我在开玩笑,伙计们…@Nobilis对不起,这个问题有点误导人,所以我现在编辑以更具体一些。谢谢你的意见@grasbueschel没问题,希望你遇到了你需要的东西,你可能是对的,有人已经为此做了某种包装:)