扫码关注官方订阅号
需求
从一个大小为1G左右的txt文档中查找某个字符串 注:只读取
平台
Windows
小菜的困惑
是不是直接将1G大小的文档直接映射到内存中,如果是这样的话,是不是意味着,将使用1G左右的内存?
业精于勤,荒于嬉;行成于思,毁于随。
如果是Linux的mmap()实现,只读条件下肯定是怎么都不会笨到真的分配这么多内存的。唯有读/写条件下,并且还要用MAP_PRIVATE方式,才会以copy-on-write机制在首次修改时分配内存。
mmap()
MAP_PRIVATE
这段代码可以绕过分区表等,直接底层读取硬盘数据。你可以看一下在运行之前和运行当中(就是最后卡在pause的时候),free命令看内存余量是没变化的。
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那么大的内存。
file view
具体的还是请参考一下MSDN:File MappingManaging Memory-Mapped Files
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
扫描下载App
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
如果是Linux的
mmap()
实现,只读条件下肯定是怎么都不会笨到真的分配这么多内存的。唯有读/写条件下,并且还要用MAP_PRIVATE
方式,才会以copy-on-write机制在首次修改时分配内存。这段代码可以绕过分区表等,直接底层读取硬盘数据。你可以看一下在运行之前和运行当中(就是最后卡在pause的时候),
free
命令看内存余量是没变化的。是的,是会使用 1G 的虚拟内存(即进程的已使用内存地址空间会增加),它会映射到磁盘上的文件上,并不消耗多少物理内存。
Unix-like only.
处理一个问题可以有多个方法,如果需求只是1G左右的TXT查找字符串,可能不一定需要使用文件映射。
反过来,这个需求使用文件映射应该是一个不错的解决。
回答楼主的问题:
内存映射并不是1:1的关系。也就是说1G文件映射到内存并不直接占用1GB的内存。
通常的概念是内存映射机制会建立一个映射对象用于管理文件和进程地址空间之间的联系,真正的文件操作通过一个叫做
file view
的东西来进行,file view
可以是映射对象的一部分,比如说4K大小。这样就提供了很大的灵活性,同时也不需要占用1G那么大的内存。具体的还是请参考一下MSDN:
File Mapping
Managing Memory-Mapped Files