zoukankan      html  css  js  c++  java
  • 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。

  • 相关阅读:
    (转)大型网站架构演变和知识体系
    最小生成树-Prim算法和Kruskal算法
    最短路径——Floyd-Warshall算法
    SpringBootService,一个基于spring boot搭建的SOA服务框架
    Netty(六)UDP在netty中的使用
    Netty(五)序列化protobuf在netty中的使用
    Netty(四)分隔符与定长解码器的使用
    Netty(三)TCP粘包拆包处理
    Netty(二)入门
    Netty(一)引题
  • 原文地址:https://www.cnblogs.com/yeahgis/p/2446290.html
Copyright © 2011-2022 走看看