【问题标题】:mmaping large files(for persistent large arrays)映射大文件(用于持久性大数组)
【发布时间】:2009-07-27 11:03:51
【问题描述】:

我正在通过 mmap 实现持久的大型常量数组。使用 mmap 时是否有任何提示和技巧或注意事项?

【问题讨论】:

    标签: c linux unix mmap


    【解决方案1】:

    存储在 mmap'd 区域内的所有指针都应作为距 mmap'd 区域基址的偏移量,而不是真正的指针!当您在下次运行程序时对该区域进行映射时,您不一定会获得相同的基地址。 (我不得不清理那些对 mmap 区域基地址恒定性做出错误假设的代码)。

    【讨论】:

      【解决方案2】:

      这是 mmap() 最直接的用例,所以应该不会有太多问题。

      您实际上只是在加载一个大型常量数组。作为常量,您不必担心同步。建议确保 prot 参数仅设置为 PROT_READ,因为您不会写入。

      如果要持续运行一个或多个使用常量的程序,那么有一个单独的程序来加载数据并使其保持常驻可能是值得的。其他程序的运行基本上只是进行共享内存附加,而不是不断地将文件读入内存。

      【讨论】:

        【解决方案3】:

        确保检查打开文件大小或内存使用的限制。在 Linux 上,有一个内置的 shell 命令 ulimit。以ulimit -a 运行以查看当前设置。

        使用 msync(2) 系统调用将内存中数组的写入刷新到文件中,否则它们可能会一直保留在内存中直到 munmap(2),并且在此之前可能会出现断电或其他情况!

        如果多个进程正在映射以读写权限共享的同一内存区域,请确保一次只有一个进程在写入,以避免损坏您的数据。或者使用文件锁定或其他一些同步方式。

        【讨论】:

        • 由于数据是恒定的,因此不需要刷新。
        猜你喜欢
        • 2018-07-27
        • 2020-06-22
        • 2011-07-02
        • 2012-04-10
        • 1970-01-01
        • 2020-03-20
        • 1970-01-01
        • 2020-11-09
        • 2018-01-15
        相关资源
        最近更新 更多