2 shmnh shmnh 于 2014.12.13 21:08 提问

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

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

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

2个回答

caozhy
caozhy   Ds   Rxr 2014.12.14 00:53
已采纳

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

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

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

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

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

ForestDB
ForestDB   Rxr 2014.12.14 00:01

可以man mmap。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!