博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
根据可用内存决定每次申请多大内存
阅读量:4972 次
发布时间:2019-06-12

本文共 2674 字,大约阅读时间需要 8 分钟。

DWORD GetPropMemSizeOneTime(){    DWORD MB = 1024*1024;    DWORD GB = 1024 * MB;    //最大一次申请1GB    DWORD dwPropOneTime = GB;    //获取可用内存的80%作为缓存    MEMORYSTATUS stat;    GlobalMemoryStatus(&stat);    SIZE_T dCurMemAvail = SIZE_T(stat.dwAvailPhys * 0.8);    if (dCurMemAvail > 32 * GB)    {        dwPropOneTime = GB;    }    else if (dCurMemAvail > 16 * GB)    {        dwPropOneTime = 512 * MB;    }    else if (dCurMemAvail > 8 * GB)    {        dwPropOneTime = 256 * MB;    }    else if (dCurMemAvail > 4 * GB)    {        dwPropOneTime = 128 * MB;    }    else if (dCurMemAvail > 2 * GB)    {        dwPropOneTime = 64 * MB;    }    else    {        //最小一次申请16MB        dwPropOneTime = 16 * MB;    }    return dwPropOneTime;}
//获取可用内存的80%作为缓存    MEMORYSTATUS stat;    GlobalMemoryStatus(&stat);    SIZE_T dCurMemAvail = SIZE_T(stat.dwAvailPhys * 0.8);    int nBandNumNeed = nBandNum != 0 ? nBandNum : 1;    int nBlockSize = int(dCurMemAvail  / nCols / nBandNumNeed);    //如果块大小超过dwPropOnetime,则取较小的值dwPropOnetime    INT64 nMemNeed = (INT64)nBlockSize * nCols * nBandNumNeed;    DWORD dwPropOnetime = GetPropMemSizeOneTime();    nMemNeed = nMemNeed > dwPropOnetime ? dwPropOnetime : nMemNeed;    //内存对齐    nMemNeed = (nMemNeed / 512 + 1) * 512;    nBlockSize = int(nMemNeed / nCols / nBandNumNeed);    nBlockSize = nRows < nBlockSize ? nRows : nBlockSize;    const int nBPP = nBPB * nBandNumNeed;    if (nBlockSize == 0)    {        //可用内存太少,影像的一行都无法正常读取        return FALSE;    }    INT64 nAllocateMem = (INT64)nBlockSize*nCols*nBandNumNeed / 1024 /1024; //MB,调试用    //allocate mem    int nMemBlock = int(dCurMemAvail / (nBlockSize*nCols*nBandNumNeed));    int nNeedMemBlockNum = nRows % nBlockSize == 0 ? nRows / nBlockSize : nRows / nBlockSize + 1;;    nMemBlock = nNeedMemBlockNum < nMemBlock ? nNeedMemBlockNum : nMemBlock;    if (nMemBlock == 0)    {        //可用内存太少,影像的一行都无法正常读取        return FALSE;    }    int nRowBlockNum = nMemBlock;    int nBlock = nBlockSize;    BYTE** pBlockBufferRead = new BYTE*[nRowBlockNum];    for (int j = 0; j < nRowBlockNum; ++j)    {        try        {            pBlockBufferRead[j] = new BYTE[nCols * nBandNum * nBPB * nBlock];            memset(pBlockBufferRead[j], 0, sizeof(BYTE)* nCols * nBandNum * nBPB * nBlock);        }        catch ( const std::bad_alloc& e )         {            //释放j之前已经分配的内存,并且将当前的指针赋值为nullptr            for (int k = 0; k < nRowBlockNum; ++k)            {                delete[] pBlockBufferRead[k];                pBlockBufferRead[k] = nullptr;            }            pBlockBufferRead[j] = nullptr;            return false;        }    }

 

转载于:https://www.cnblogs.com/autumoonchina/p/8242597.html

你可能感兴趣的文章
sicily-1029 Rabbit
查看>>
30分钟学会React Hook, Memo, Lazy
查看>>
BZOJ 1567: [JSOI2008]Blue Mary的战役地图
查看>>
取余运算(mod)(分治)
查看>>
括号编码
查看>>
课程作业五
查看>>
typename使用在模板中区分static成员和类型
查看>>
旋转队列
查看>>
归并排序
查看>>
color 文件
查看>>
delphi xe 怎么生成apk
查看>>
cxGrid 知识点
查看>>
门控时钟-理论分析 ---- 转载
查看>>
Java8 Lambda
查看>>
关于https中的算法
查看>>
周记 2015.05.09
查看>>
java之设计模式
查看>>
Oracle之Group by和Having-----转了
查看>>
未能加载文件或程序集“System.Data.SQLite”或它的某一个依赖项”的解决方法
查看>>
【Codeforces】964A Splits【数学题】
查看>>