在虚拟地址空间足够的情况下内存映射大文件失败

mengxiang2003 2009-01-22 08:44:31
我想映射一个大小900多M的文件,CreateFileMapping能够返回有效句柄,但MapViewOfFile却失败返回0,错误代码是8,存储空间不足 无法处理此命令。但是我用GlobalMemoryStatus查看了一下,可用地址空间还有接近2G呢。也就是说地址空间是足够的。请问还有别的原因能够导致失败吗?下面是我的代码

hFile=CreateFile(pcszDicName,
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
if(hFile == INVALID_HANDLE_VALUE) exit(0);
hFilemap = CreateFileMapping(hFile,NULL,PAGE_READONLY,0,0,"TTS");



MEMORYSTATUS ms = {sizeof(ms)};
GlobalMemoryStatus(&ms);
DWORD availVirtual = ms.dwAvailVirtual;
FILE* flog = fopen("d:\\log","a");
fprintf(flog," availVirtual:%d\n",availVirtual);
fclose(flog);

void* pVoid=MapViewOfFile(hFilemap,FILE_MAP_READ,0,0,0);
dwe = GetLastError();
if(pVoid == NULL)
{
MEMORYSTATUS ms = {sizeof(ms)};
GlobalMemoryStatus(&ms);
DWORD availVirtual = ms.dwAvailVirtual;
FILE* flog = fopen("d:\\log","a");
fprintf(flog,"hFilemap = CreateFileMapping failed\n");
fprintf(flog,"error:%d",dwe);fprintf(flog," availVirtual:%d\n",availVirtual);
fclose(flog);
printf("mapping failed£¬lack of memory");
exit(0);
}

这是log文件信息:
availVirtual:2068520960
hFilemap = CreateFileMapping failed
error:8 availVirtual:2068520960
...全文
309 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
mengxiang2003 2009-02-02
  • 打赏
  • 举报
回复
过年回来,先给楼上各位拜年啦
我现在改成分段映射了,问题确实解决了。
但现在的疑问是,原先同样的程序,在我的机器上900M能够全部映射没有问题,为什么在别人的机器上就映射不了呢。都是32位的xp系统。
在同样的进程中,系统核心文件,堆栈之类的映射到一个进程的地址空间不是固定的吗?为什么有的时候能够造成空间不连续(映射不了900M),而有的时候却又可以?
cnzdgs 2009-01-22
  • 打赏
  • 举报
回复
确定是900MB吗?一般情况下900MB不会有问题,如果由于没有足够的连续地址空间,可以改成在程序初始化时,先执行CreateFileMapping、MapViewOfFile。
oyljerry 2009-01-22
  • 打赏
  • 举报
回复
你应该考虑把文件分割成更小的块来读取,而不是一次读取这么大..
mengxiang2003 2009-01-22
  • 打赏
  • 举报
回复
谢谢回答。
可是我对这个文件的读取是极其频繁的,频繁的切换MapViewOfFile会造成访问速度的下降。
能否在进程一开始在高位先预留900M虚拟空间,在需要映射时再释放,或者有没有能够整理进程地址空间碎片的函数^_^(有点奢望)
fandh 2009-01-22
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 arong1234 的回复:]
“虚拟地址空间足够”是不足够的,做这个操作的前提是“连续虚拟地址空间足够”,也就是说
你的地址空间必须是有连续900M没有被占用才行。加入你有3个500MB的空间不靠一块,尽管
总的虚拟地址空间足够,你也一样不能用。

映射900MB的文件没有必要一次把900MB的空间全占了,一般都是映射几页(一页4096字节)
到虚拟地址空间,需要访问其他内容时,在用MapViewOfFile切换
[/Quote]
强,学习了一下!
arong1234 2009-01-22
  • 打赏
  • 举报
回复
“虚拟地址空间足够”是不足够的,做这个操作的前提是“连续虚拟地址空间足够”,也就是说
你的地址空间必须是有连续900M没有被占用才行。加入你有3个500MB的空间不靠一块,尽管
总的虚拟地址空间足够,你也一样不能用。

映射900MB的文件没有必要一次把900MB的空间全占了,一般都是映射几页(一页4096字节)
到虚拟地址空间,需要访问其他内容时,在用MapViewOfFile切换
fairyprince 2009-01-22
  • 打赏
  • 举报
回复
你的物理内存剩余有 2g?

mengxiang2003 2009-01-22
  • 打赏
  • 举报
回复
没有人回答吗?着急啊

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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