远古大猛犸 2014-12-13 13:08 采纳率: 50%
浏览 2378
已采纳

mongodb mmap内存映射是把文件中数据全部映射到内存中的吗?

资料上说:在Mongodb中,其使用了操作系统底层提供的内存映射机制,即MMAP。MMAP可以把磁盘文件的一部分或全部内容直接映射到内存,这样文件中的信息位置就会在内存中有对应的地址空间,这时对文件的读写可以直接用指针来做,而不需要read/write函数了。同时操作系统会将数据刷新保存到磁盘上。

我有个疑问:这个内存映射,是把文件中数据全部映射到内存中的吗?还是只是映射一部分内容,那么这部门内容又是什么的呢?
请专家给指点下,谢谢!

  • 写回答

2条回答 默认 最新

  • threenewbee 2014-12-13 16:53
    关注

    如果内存映射文件是将文件全部读取到内存中,那么“内存映射文件”和你直接从文件读取数据,全部装入内存就没有区别了,内存映射文件也就没有存在的意义了。

    内存映射文件的原理是通过数据访问局部性这个原理来提高性能的。什么叫数据访问局部性呢?我们从统计学意义上分析,如果你读取文件中某个地方的数据,那么你接下来读取的数据在之前读取地址附近的概率,要比读取很远的地方的数据的概率要高。

    那么,如果操作系统得到请求,你要获取某个数据,它在读取这个数据的时候,顺带手将这一块的数据都读取到内存中。也许接下来很不幸,你读取的数据不在操作系统预取的范围内,但是这是少数情况。多数情况是,你接下来再读的数据,内存中已经有了,此时操作系统无需再访问磁盘,直接从内存中返回。

    虽然这比一次性全部读进内存,100%的数据都能访问到要稍微逊色一些,但是我们用很经济的代价(可能只要原数据10%的内存)得到了近乎完美的性能(和完全读到内存相比性能可能相差10%)。

    是不是这样一来性能就提高了?内存映射文件的含义就是,操作系统透明处理了很多加载、更新、回写缓存的操作,使得开发者看上去像是读取文件,但是结果是更快实现了IO的存取。同时又避免数据过大不能一次性读取到内存的问题。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 python天天向上类似问题,但没有清零
  • ¥30 3天&7天&&15天&销量如何统计同一行
  • ¥30 帮我写一段可以读取LD2450数据并计算距离的Arduino代码
  • ¥15 C#调用python代码(python带有库)
  • ¥15 矩阵加法的规则是两个矩阵中对应位置的数的绝对值进行加和
  • ¥15 活动选择题。最多可以参加几个项目?
  • ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型
  • ¥15 vs2019中数据导出问题
  • ¥20 云服务Linux系统TCP-MSS值修改?
  • ¥20 关于#单片机#的问题:项目:使用模拟iic与ov2640通讯环境:F407问题:读取的ID号总是0xff,自己调了调发现在读从机数据时,SDA线上并未有信号变化(语言-c语言)