【问题标题】:Large file memory management大文件内存管理
【发布时间】: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 没问题,希望你能找到你需要的东西,你可能是对的,有人已经为此做了某种包装:)

标签: c file memory mmap


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2011-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-02
    • 2018-04-20
    • 2013-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多