GDALWarp设置GDALWarpOptions::dfWarpMemoryLimit过大时处理失败
使用GDALWarp写了一个裁切图像的算法,在小内存的电脑没事,大内存的电脑就处理失败(32位也没问题),查看GDAL的日志发现下面的错误信息:
Fri Apr 08 17:39:02 2016: GDAL: GDALOpen(E:/Out/TRIPLESAT_1_PAN_L1_20160330024710_000315VI_005.tif, this=000000000508EB40) succeeds as GTiff.
Fri Apr 08 17:39:02 2016: GDAL: GDALDriver::Create(GTiff,E:\xxx/TRIPLESAT_1_PAN_L1_20160330024710_000315VI_005_20160406003001_001.tif,31260,24550,1,UInt16,0000000000000000)
Fri Apr 08 17:39:04 2016: WARP_TIMING: Output buffer read: 2s
Fri Apr 08 17:39:07 2016: WARP_TIMING: Input buffer read: 3s
Fri Apr 08 17:39:07 2016: CPLError: Out of memory allocating -1225110252 bytes for UnifiedSrcDensity mask.
ERROR 2: Out of memory allocating -1225110252 bytes for UnifiedSrcDensity mask.
从上面的日志中可以看出,居然申请内存失败了,见过小内存的机器申请内存失败的,没见过大内存的机器申请内存失败,很郁闷。
对比了小内存机器和大内存机器输入的数据,所有的参数都一样,除了GDALWarpOptions::dfWarpMemoryLimit这个。由于程序需要处理大量的数据,而且机器的内存也很大(128GB),所以就在程序启动之后先获取了系统的空闲内存,然后将空闲内存的四分之一设置给了dfWarpMemoryLimit这个参数(大内存机器这个值大概25GB左右)。将这个值手动改小,程序正确处理了,看来就是这个参数的原因。
通过调试GDAL的代码,在文件gdalwarpoperation.cpp中的函数GDALWarpOperation::CreateKernelMask中有下面的代码(SVN版本库中的代码行数大致在2059行,其他所有的版本都有这个问题,已经提交gdal的bug库)
if( *ppMask == NULL )
{
int nBytes; //this line should be GIntBig nBytes;
if( nBitsPerPixel == 32 )
nBytes = (nXSize * nYSize + nExtraElts) * 4;
else
nBytes = (nXSize * nYSize + nExtraElts + 31) / 8;
*ppMask = VSI_MALLOC_VERBOSE( nBytes );
if( *ppMask == NULL )
{
return CE_Failure;
}
memset( *ppMask, nDefault, nBytes );
}
从上面的代码中看的话,其实一般情况下没有任何问题,除了一种情况,如果nXSize和nYSize很大,比如我日志中的(31260*24550+nExtraElts)*4,即使nExtraElts=0,结果也会超过int的存储范围导致数据溢出,从而nBytes的值就会变成负数,进而分配内存的时候就失败了。下面是修改后的代码:
if( *ppMask == NULL )
{
GIntBig nBytes;
if( nBitsPerPixel == 32 )
nBytes = ((GIntBig )nXSize * nYSize + nExtraElts) * 4;
else
nBytes = ((GIntBig )nXSize * nYSize + nExtraElts + 31) / 8;
*ppMask = VSI_MALLOC_VERBOSE( nBytes );
if( *ppMask == NULL )
{
return CE_Failure;
}
memset( *ppMask, nDefault, nBytes );
}
下面的图是GDAL出错时的各个变量的信息。
GDALWarp设置GDALWarpOptions::dfWarpMemoryLimit过大时处理失败的更多相关文章
- 【SecureCRT配置】修改默认卷屏行数当做一个操作,屏幕输出有上百行,当需要将屏幕回翻时,这个设置会有很大帮助,默认为500行,可以改为10000行,不用担心找不到了。 选项 => 全局选项 => Default Session => Edit Default Settings => Terminal => Emulation => Scrollback 修改为32000。
SecureCRT配置屏幕内容输出到log文件 SecureCRT看不到前几分钟操作的内容,或者想把通过vi命令查看的日志输出到log文件(在懒得下载日志文件的情况下),所以接下来就这样操作: 文件保 ...
- easyUI draggable插件使用不当,导致拖动div内部文本框无法输入;设置echarts数据为空时就显示空白,不要动画和文字
先上一个Demo <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://ww ...
- 【解决方案】客户端请求数据较大时,nginx返回数据被截断
[问题描述]:客户端使用curl命令向nginx请求数据,当返回数据量较大时,数据被截断,客户端无法获取完整的数据. [问题原因]:nginx配置文件中包含了proxy_buffer_size.pro ...
- 修复ThinkPHP导出excel数字过大时显示为科学记数法
修复ThinkPHP导出excel数字过大时显示为科学记数法,这种显示对于查看的用户来说是及其不友好的.所以,我们要使其转化为正常的数字串! 我在google 的过程中,查了一些资料.其中 1).// ...
- storm正常任务数据量过大时造成定时任务不执行的问题
在执行storm的定时任务时,发现storm普通任务数据量过大时造成定时任务不执行, 同时设置了storm的普通任务和定时任务,定时任务设置5秒执行1次. 普通任务的数据时从spout中不停发射字符串 ...
- chart.js插件生成折线图时数据普遍较大时Y轴数据不从0开始的解决办法[bubuko.com]
chart.js插件生成折线图时数据普遍较大时Y轴数据不从0开始的解决办法,原文:http://bubuko.com/infodetail-328671.html 默认情况下如下图 Y轴并不是从0开始 ...
- 设置Activity显示和关闭时的动画效果
设置Activity显示和关闭时的动画效果 通过overridePendingTransition方法可以设置Activity显示和关闭的动画效果.首先需要在res/anim目录中建立相应的动画资源文 ...
- 斯坦福大学公开课机器学习:machine learning system design | data for machine learning(数据量很大时,学习算法表现比较好的原理)
下图为四种不同算法应用在不同大小数据量时的表现,可以看出,随着数据量的增大,算法的表现趋于接近.即不管多么糟糕的算法,数据量非常大的时候,算法表现也可以很好. 数据量很大时,学习算法表现比较好的原理: ...
- 设置一个div网页滚动时,使其固定在头部,当页面滚动到距离头部300px时,隐藏该div,另一个div在底部,此时显示;当页面滚动到起始位置时,头部div出现,底部div隐藏
设置一个div网页滚动时,使其固定在头部,当页面滚动到距离头部300px时,隐藏该div,另一个div在底部,此时显示: 当页面滚动到起始位置时,头部div出现,底部div隐藏 前端代码: <! ...
随机推荐
- Linux(四)使用Xshell5远程登录
Xshell5和Xftp5的安装包 链接:https://pan.baidu.com/s/1q3-ch75TW3lvC3KX25klNQ 密码:m31n 说明: 公司开发的时候,具体情况是这样的: 1 ...
- 使用C# (.NET Core) 实现组合设计模式 (Composite Pattern)
本文的概念性内容来自深入浅出设计模式一书. 本文需结合上一篇文章(使用C# (.NET Core) 实现迭代器设计模式)一起看. 上一篇文章我们研究了多个菜单一起使用的问题. 需求变更 就当我们感觉我 ...
- [Codeforces 946D]Timetable
Description 题库链接 给你一个 \(N\times M\) 的 \(01\) 矩阵,你可以从中将一些 \(1\) 变为 \(0\) ,最多 \(K\) 次.使操作之后使得每行最远的 \(1 ...
- [Sdoi2009]Elaxia的路线
Description 最近,Elaxia和w**的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起的时间.Elaxia和w**每天都要奔波于宿舍和实验室之间, ...
- codeforces round #419 C. Karen and Game
C. Karen and Game time limit per test 2 seconds memory limit per test 512 megabytes input standard i ...
- ●UVa 1589 Xiangqi(模拟)
●赘述题意 给出一个中国象棋残局,告诉各个棋子的位置,黑方只有1枚“将”,红方有至少2枚,至多7枚棋子,包含1枚“帅G”,和若干枚“车R”,“马H”,“炮C”.当前为黑方的回合,问黑方的“将”能否在移 ...
- bzoj4447[Scoi2015]小凸解密码
4447: [Scoi2015]小凸解密码 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 150 Solved: 58[Submit][Status ...
- [BZOJ]1050 旅行comf(HAOI2006)
图论一直是小C的弱项,相比其它题型,图论的花样通常会更多一点,套路也更难捉摸. Description 给你一个无向图,N(N<=500)个顶点, M(M<=5000)条边,每条边有一个权 ...
- Simpson积分(BZOJ2178)
lrj的代码常数太大T了QAQ,改了一下. #include <cstdio> #include <cmath> #include <algorithm> usin ...
- Python中模块之shutil及zipfile&tarfile的功能介绍
shutil的功能介绍及其他打包.压缩模块 1. shutil模块的方法 chown 更改指定路径的属组 2. copy 拷贝文件和权限 方法:shutil.copy(src,dst,*,follow ...