远古大猛犸 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 Qt下使用tcp获取数据的详细操作
  • ¥15 idea右下角设置编码是灰色的
  • ¥15 全志H618ROM新增分区
  • ¥20 jupyter保存图像功能的实现
  • ¥15 在grasshopper里DrawViewportWires更改预览后,禁用电池仍然显示
  • ¥15 NAO机器人的录音程序保存问题
  • ¥15 C#读写EXCEL文件,不同编译
  • ¥15 MapReduce结果输出到HBase,一直连接不上MySQL
  • ¥15 扩散模型sd.webui使用时报错“Nonetype”
  • ¥15 stm32流水灯+呼吸灯+外部中断按键