GDAL并行IO的疑问

GDAL是否可以支持并行I/O?

最近使用GDAL并行IO读写实验,我们采用GDAL库+MPI+NFS在fedora15系统上开展,实验证明该方法没有遇到预先设想的问题,

比如:写文件冲突。目前我也不清楚是否是NFS有内在机制会协调各个进程之间的先后顺序,总之现在看来并行计算是没有问题的,但是

不少人说GDAL是不支持并行IO的,有人采用令牌循环的方式写文件,实质还是串行。该天换个大数据试试。

 

先说说我遇到的问题,我在用GDAL做矢栅转换时,扩展了一个GDAL函数:GDALGeometriesRasterizeBuf,多个geometry对象转栅格

到void*,目的是分块并行计算,然后再利用NFS并行写到文件中。程序完成后调试发现单机单进程跑没有任何问题,单机多进程跑出现偏移现象。

发现数据分块接线处有重合现象,且往往遇到最后一个进程的计算结果写入失败。初步认为这是由于重复的浮点数计算导致误差增加导致,一开始

是通过计算envelop,对envelop进行划分,再通过仿射变换矩阵计算每个分块的行列号和大小,这个过程存在精度丢失。后来修改为通过计算整个

图像的行列数,再通过按行划分分块反推每块的envelop,利用R树索引以得到的envelop查询所有feature进行栅格化,得到正确结果。但是虽然

图像偏移得到解决,但是有时候部分进程写入失败的问题还是没有解决,并且20~40M的图像写到共享目录的时间竟然长达60~80s,要知道我们

局域网虽然是100M带宽,可正常传输速度也是可以到13M/s的,必然存在问题。反复的研究代码,与同事的代码对比发现我的主进程创建了栅格文件

后,DatasetH句柄并没有Close掉,而是继续使用来接收主进程的计算结果,处理I/O。问题就出在这里,我为了省几行代码,忽略了主进程创建的

文件在没有Close掉的情况下,其他进程是无法顺利写入数据的,并且可能涉及频繁的锁定和争抢资源,导致IO效率极低,且存在错误。

 

解决办法:创建完栅格数据并设置好参数后立即关闭DatasetH句柄,到主进程计算完毕需要写入结果时再重新打开一个句柄调用GDALRasterIO接口

写入数据既可。见下图:我就是忽略了Step B。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值