内存映射文件,不断写数据物理内存上涨

dahaiI0 2012-03-05 09:45:59
CreateFileMapping创建映像文件100M,MapViewOfFile返回char*指针,通过这个指针写入100M数据,为什么物理内存会不断上涨,写完后又降下来了。
...全文
324 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
Lactoferrin 2012-03-06
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 dahaii0 的回复:]
代码很少
DWORD dwSize = 50*1024*1024;
char *p = new char[dwSize ];
ASSERT(P);
for(int i = 0;i<dwSize ;i++)
{
*(p+i) = 1;
}
delete []p;
[/Quote]
手机没法试
先猜测两个原因
1.太快了,任务管理器来不及显示
2.全优化掉了
dahaiI0 2012-03-06
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 lactoferrin 的回复:]
一次映射完,然后顺序写一遍,则每个页都要分配帧,很占内存
[/Quote]
多谢列宁同志的指点
dahaiI0 2012-03-06
  • 打赏
  • 举报
回复
多谢,结贴
Lactoferrin 2012-03-06
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 dahaii0 的回复:]
引用 16 楼 lactoferrin 的回复:

一次映射完,然后顺序写一遍,则每个页都要分配帧,很占内存

这里提到的每个页面都要分配帧,指的是进程虚拟空间中的页面还是物理内存中的页面?
[/Quote]
页是指虚拟内存的,帧是物理内存的
fly4free 2012-03-06
  • 打赏
  • 举报
回复
猜测
CreateFileMapping
MapViewOfFile

可能仅仅是做了一个mark,真正访问的时候才会 分配内存空间。
而再次访问就没必要了。
dahaiI0 2012-03-06
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 lactoferrin 的回复:]

一次映射完,然后顺序写一遍,则每个页都要分配帧,很占内存
[/Quote]
这里提到的每个页面都要分配帧,指的是进程虚拟空间中的页面还是物理内存中的页面?
dahaiI0 2012-03-05
  • 打赏
  • 举报
回复
代码很少
DWORD dwSize = 50*1024*1024;
char *p = new char[dwSize ];
ASSERT(P);
for(int i = 0;i<dwSize ;i++)
{
*(p+i) = 1;
}
delete []p;
Lactoferrin 2012-03-05
  • 打赏
  • 举报
回复
于此对比的是,new几百M字节的缓冲区,写入数据到缓冲区。delete这个缓冲区,物理内存基本没变化,这里new返回的指针应该也是个虚拟地址,写入数据也要通过CPU映射到物理内存,为啥这又没变化?

给代码
Lactoferrin 2012-03-05
  • 打赏
  • 举报
回复
一次映射完,然后顺序写一遍,则每个页都要分配帧,很占内存
zhanshen2891 2012-03-05
  • 打赏
  • 举报
回复
怕吃内存你还用它干什么?
dahaiI0 2012-03-05
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 danscort2000 的回复:]
你不会是把整个文件都给映射到内存中去了吧?
应该分段映射
[/Quote]
请问为什么要分段映射?文件没有超过4G,就几百M,能保证一次映射完。我也听别人说过要分段映射,但是为什么要这样做呢
danscort2000 2012-03-05
  • 打赏
  • 举报
回复
你不会是把整个文件都给映射到内存中去了吧?
应该分段映射
dahaiI0 2012-03-05
  • 打赏
  • 举报
回复
我用映射文件,都是把整个文件一次映射进去,是不是应该分段映射,如果分段映射,每次映射多少数据合适?64KB?几M?
dahaiI0 2012-03-05
  • 打赏
  • 举报
回复
最后问个关于使用内存映射文件,物理内存变化的问题,将一个磁盘文件映射到进程的虚拟地址空间,这与物理内存应该是木有关系的,把数据写入映射文件,CPU会将虚拟地址映射到物理内存,通过任务管理器能发现在写数据时,物理内存会不断上涨,写完关闭映射才降下来,请问这是什么原因?

于此对比的是,new几百M字节的缓冲区,写入数据到缓冲区。delete这个缓冲区,物理内存基本没变化,这里new返回的指针应该也是个虚拟地址,写入数据也要通过CPU映射到物理内存,为啥这又没变化?

恳请高人指点,若能解决分不是问题
dahaiI0 2012-03-05
  • 打赏
  • 举报
回复
楼上的大哥好,我现在碰到个问题,同时开了几个线程,每个线程都各自往一个映射文件里写数据(文件都可能是几百M),物理内存很容易就飙升到80,90%多,这个有什么办法可以解决下
gameslq 2012-03-05
  • 打赏
  • 举报
回复
有什么问题?本来CreateFileMapping就是物理空间换时间的技术。
dahaiI0 2012-03-05
  • 打赏
  • 举报
回复
一次映射整个文件与分段映射在效率和内存方面有什么区别,假设文件不超过4G,我写了个例子,发现2者没什么区别,物理内存都涨了10-20%多,写完数据都降下来了。
Lactoferrin 2012-03-05
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 dahaii0 的回复:]
引用 7 楼 lactoferrin 的回复:

不相信操作系统可以用无缓冲io,自己管理缓存

请教下,能否具体明示之,俺不太清楚
[/Quote]
CreateFile里面FILE_FLAG_NO_BUFFERING
dahaiI0 2012-03-05
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 stjay 的回复:]

FlushViewOfFile 一下
[/Quote]
多谢,我先试下。
dahaiI0 2012-03-05
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 lactoferrin 的回复:]

不相信操作系统可以用无缓冲io,自己管理缓存
[/Quote]
请教下,能否具体明示之,俺不太清楚
加载更多回复(3)

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧