正在维护别人写的一个VC++的项目,出了点问题,原来从来没写过VC++,不知道怎么办了!
这个小项目的功能是这样的,把总共大小2.3GB的四十几个文件,按顺序写到用USB连接的设备中,因为一次可以连接多个设备,多线程同时写,所以用的下面的这个东西,查了资料是智能指针:
shared_ptr<CAtlFileMapping<>> spFileMapping
有一个函数,先检查这个智能指针中有没有当前要加的文件:
s_mapFileMapping.FindKey(fileName)
如果有就直接取出来,再写到设备中,如果没有就先加到spFileMapping中:
CAtlFile file; hr = file.Create(pszFileName, GENERIC_READ, FILE_SHARE_READ, OPEN_EXISTING); spFileMapping.reset(new CAtlFileMapping<>()); if (!spFileMapping) return E_OUTOFMEMORY; hr = spFileMapping->MapFile(file); if (FAILED(hr)) return hr;
这个软件一直用着好好的,直到最近要写的其中一个文件A变大,有2.5GB这个大!要写的文件加起来总共3.1GB。
现在一到spFileMapping->MapFile(A-file);这行,就报存储空间不足,无法处理此命令,请教各位VC高手,这个现在要怎么弄啊,我看内存并没有满,我的笔记本4G的内存,是不是这个mapfile把所有的文件都加载内存中去了,然后哪个线程要去取文件就直接到内存去取了?
如果是这样的话,要怎么弄才能防止出现储空间不足这样的情况?
把程序修改为 x64 编译。
这么改完之后还是一样的,一mapfile那个大文件就提示“存储空间不足”
@mrhyher: 那个 win32 也改成 x64
@Launcher: 那个改不了,里面没有X64
@mrhyher: 你调试一下,进入 spFileMapping->MapFile(A-file) 这个函数,然后告诉我 MapFile 方法执行到哪里就返回了。
@Launcher: 到atlfile.h文件中580行:
m_pData = ::MapViewOfFileEx(m_hMapping, m_dwViewDesiredAccess, m_nOffset.HighPart, m_nOffset.LowPart, m_nMappingSize, NULL); if (m_pData == NULL) { HRESULT hr; hr = AtlHresultFromLastError(); ::CloseHandle(m_hMapping); m_hMapping = NULL; return hr; }
m_pData为NULL,返回了AtlHresultFromLastError。
@mrhyher: 你机器的物理内存多大?
@Launcher: 4.00GB(3.70GB可用)
@mrhyher: 操作系统是多少位的?
@Launcher: 64位的,
大神,我又提了一个为什么不能把解决方案平台改成X64的问题:http://q.cnblogs.com/q/80829/