Python并行计算在mdb转gdb中的应用

作者:凡江林  QQ:564438737

(1)问题描述

前两天接到领导的任务,要把mdb的1:10000地形图转成cad的格式。一共有75个图幅。每一张1:10000地形图都是基于制图表达的方式来做的。经过对原始资料的整理分析,发现每一张1:10000地形图需要处理的是ANNO要素数据集(涉及到2个要素类)和DLG要素数据集(涉及到40个要素类)。

最开始的思路是,通过arcgis的导出工具Export to CAD。但由于涉及到75个幅图之多。如果每转一次都去选择一次工具运行,那效率明显很低。并且,在用arcgis工具导出数据的时候,经常会出现异常而导致arcgis软件关闭的情况。进一步思考,想到了利用arcgis的Python脚步来实现自动化的任务。

通过Python自动化的任务后,实现了数据导出到CAD的功能。但存在以下两个问题:一是执行效率较低。二是导出的CAD等高线不带高程属性(但这次任务的重点是等高线需要带高程属性,方便对基础1:10000地形图的应用。))

(2)流程思路

既然直接用arcgis导出mdb到CAD的思路不可行。那么,就得借助FME的强大空间数据转换功能。但通过尝试后发现,FME不支持mdb的空间数据库格式,但是支持gdb的格式。那么,第一步就是需要把mdb格式的数据转成gdb格式的。通过利用Python脚本把mdb转成gdb的格式。但是,在转换过程中,发现这是一个非常耗时的工程。平均转换一个mdb的1:10000图到gdb的格式,耗时约为10分钟左右。那么,10分钟*75=750分钟,也就是12.5小时。

在不经意的浏览任务管理器的时候,发现运行的脚本的CPU和内存并没有占用多少;相反,大部分都是空闲的,于是想到了并发执行。通过在网络上查阅了相关资料,找到了Pyhton中一种简单的并发执行的方式。最终整理了如下的一段演示代码,供有相关需求的专业人士参考。

#coding:utf-8
import arcpy
from multiprocessing import Pool as ThreedPool
import  test001
if __name__ == '__main__':

    list=['G48G017126']
    pool = ThreedPool(7)
    pool.map(test001.myCopyFeatureClass, list)
    pool.close()
    pool.join()
def myCopyFeatureClass(k):
   ...

(考虑到1:10000图的保密性。已经对图幅号进行了变更。特在此说明。)

以上代码中,通过引入multiprocessing包的Pool模块。然后根据CPU的实际运行情况,新建一个pool=ThreedPool(7)的7个并发数的实例。(具体并发数,需要根据自己电脑的配置,进行相关的调整。)然后利用pool.map函数,调用处理函数引用,并把列表或是元组作为参数传递进去。即可执行并行计算。

(3)探索结论

通过对75幅1:10000图的mdb转gdb的实际运行转换。发现通过并发执行的方式,大约用了3小时左右。相比之前的普通执行的12.5小时,节约了3倍多的时间。

推而广之:在利用ArcPy处理空间数据过程中,当涉及到数据量巨大,特别耗费时间的任务的时候,可以考虑把任务并行化分解执行。通过并行化方式执行,能够大大提高数据处理的效率,节约数据处理的时间。

(限于作者的学识和经验,定有不少疏漏和不当之处,甚至是错误也在所难免,恳请读者和同行批准指正!)


你可能感兴趣的:(FME相关,ARCGIS相关,Python相关)