5

我正在寻找有关如何在我的库中透明且健全地处理对大型(定义为:大于可寻址内存)文件/块设备的访问的帮助。假设我们在 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 的解决方案很满意。

4

1 回答 1

1

我会使用“框架式 mmap”和“大文件支持”,这是 Linux 的一部分。从Wikipedia文章开始,然后转到SuSE 网站中的技术细节。

stackoverflow上也有一些在线示例和一些答案。我不认为你可以很容易地找到一些预先准备好的图书馆。就像上面的链接所暗示的那样,处理大型多媒体文件的软件的源代码可能会有所帮助,它们的“框架”性质可能会导致一些有趣的片段。

于 2013-08-31T20:12:19.240 回答