首页 新闻 赞助 找找看

VC++中shared_ptr<CAtlFileMapping<>> MapFile大文件提示存储空间不足

0
悬赏园豆:80 [已解决问题] 解决于 2016-04-21 19:47

正在维护别人写的一个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把所有的文件都加载内存中去了,然后哪个线程要去取文件就直接到内存去取了?

如果是这样的话,要怎么弄才能防止出现储空间不足这样的情况?

mrhyher的主页 mrhyher | 初学一级 | 园豆:5
提问于:2016-03-24 15:26
< >
分享
最佳答案
0

 

把程序修改为 x64 编译。

收获园豆:80
Launcher | 高人七级 |园豆:45045 | 2016-03-24 16:55

这么改完之后还是一样的,一mapfile那个大文件就提示“存储空间不足”

mrhyher | 园豆:5 (初学一级) | 2016-03-25 16:40

@mrhyher: 那个 win32 也改成 x64

Launcher | 园豆:45045 (高人七级) | 2016-03-25 16:55

@Launcher: 那个改不了,里面没有X64

mrhyher | 园豆:5 (初学一级) | 2016-03-25 17:13

@mrhyher: 你调试一下,进入 spFileMapping->MapFile(A-file) 这个函数,然后告诉我 MapFile 方法执行到哪里就返回了。

Launcher | 园豆:45045 (高人七级) | 2016-03-25 17:16

@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 | 园豆:5 (初学一级) | 2016-03-25 18:08

@mrhyher: 你机器的物理内存多大?

Launcher | 园豆:45045 (高人七级) | 2016-03-28 09:11

@Launcher: 4.00GB(3.70GB可用)

mrhyher | 园豆:5 (初学一级) | 2016-03-28 09:33

@mrhyher: 操作系统是多少位的?

Launcher | 园豆:45045 (高人七级) | 2016-03-28 09:36

@Launcher: 64位的,

大神,我又提了一个为什么不能把解决方案平台改成X64的问题:http://q.cnblogs.com/q/80829/

mrhyher | 园豆:5 (初学一级) | 2016-03-28 10:02
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册