C++:这种情况使用“内存映射文件”合适吗?
迷茫
迷茫 2017-04-17 11:14:26
[C++讨论组]

需求

从一个大小为1G左右的txt文档中查找某个字符串
注:只读取

平台

Windows

小菜的困惑

是不是直接将1G大小的文档直接映射到内存中,如果是这样的话,是不是意味着,将使用1G左右的内存?

迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

全部回复(3)
怪我咯

如果是Linux的mmap()实现,只读条件下肯定是怎么都不会笨到真的分配这么多内存的。唯有读/写条件下,并且还要用MAP_PRIVATE方式,才会以copy-on-write机制在首次修改时分配内存。

这段代码可以绕过分区表等,直接底层读取硬盘数据。你可以看一下在运行之前和运行当中(就是最后卡在pause的时候),free命令看内存余量是没变化的。

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
int fd;
unsigned char *phdd;
int i;
fd=open("/dev/sdb", O_RDONLY);
phdd=mmap(NULL, 1024UL*1024*1024, PROT_READ, MAP_SHARED, fd, 0);
for (i=0; i<1024; i++) {
putchar(*(phdd+i));
}
system("sleep 60");
return 0;
}
大家讲道理

是的,是会使用 1G 的虚拟内存(即进程的已使用内存地址空间会增加),它会映射到磁盘上的文件上,并不消耗多少物理内存

Unix-like only.

大家讲道理

处理一个问题可以有多个方法,如果需求只是1G左右的TXT查找字符串,可能不一定需要使用文件映射。
反过来,这个需求使用文件映射应该是一个不错的解决。

回答楼主的问题:
内存映射并不是1:1的关系。也就是说1G文件映射到内存并不直接占用1GB的内存。
通常的概念是内存映射机制会建立一个映射对象用于管理文件和进程地址空间之间的联系,真正的文件操作通过一个叫做file view的东西来进行,file view可以是映射对象的一部分,比如说4K大小。这样就提供了很大的灵活性,同时也不需要占用1G那么大的内存。

具体的还是请参考一下MSDN:
File Mapping
Managing Memory-Mapped Files

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号