zoukankan      html  css  js  c++  java
  • 批处理文件(.bat)并行Arcpy脚本提高效率的思路

    Arcpy提供数据处理的方便接口,但一个Arcpy脚本通常只运行于一个核上。现在电脑通常是多核乃至多处理器,如果能将任务分解为可同时进行的若干任务,便可通过并行充分利用电脑性能。

    折腾了python并行模块,根据教程尝试多进程处理,但我没有折腾成功。这个是批处理教程链接:http://zhihu.geoscene.cn/article/583。

    后来经过实验发现,同时打开多个Arcpy IDLE 进去运行脚本,算是笨拙的实现了多进程处理数据。但每次都要打开IDLE 然后打开脚本文件并运行,也挺烦人,最近找到了编写.bat脚本实现这一步的方法,下面将其进行分享。

    以栅格数据掩膜提取为例。总共68个文件须掩膜提取,单独做每个需要1小时左右,因此编写了7个脚本同时进行,脚本数量要根据自己计算机配置决定。

    1 Arcpy脚本

    1.1 参数准备

    借鉴上述批处理教程思路,脚本分为运行参数准备、API运行、循环实现三大部分。首先定义运行参数准备函数,将所有输入输出参数存储到一个嵌套列表中,方便API运行时的调用。

     1 # -*- coding: utf-8 -*-
     2 #Mosaic To New Raster
     3 import arcpy
     4 from arcpy.sa import *
     5 import time
     6 import os
     7 import glob
     8 
     9 # 函数用于准备掩膜提取工具运行参数
    10 def pre_parameter(inpath, outpath, mask):
    11     parameters = []  
    12     infiles = glob.glob("*.tif")
    13     
    14     for infile in infiles: 
    15         inRaster = infile
    16         inMaskData = mask
    17         outRaster = os.path.join(outpath, infile)
    18         parameter = [inRaster, inMaskData, outRaster]
    19         parameters.append(parameter)
    20     return parameters

    1.2 API运行

    根据定义的运行参数结构,定义API运行函数。

     1 # Arcpy函数掩膜提取
     2 def Extract_by_Mask(Parameter):
     3     # Set local variables
     4     inRaster = Parameter[0]
     5     inMaskData = Parameter[1]
     6     outRaster = Parameter[2]
     7     # Execute ExtractByMask
     8     outExtractByMask = ExtractByMask(inRaster, inMaskData)
     9     # Save the output 
    10     outExtractByMask.save(outRaster)
    11     print(outRaster, 'has finshed')

    1.3 循环实现

    因为将参数存储到了列表中,所以for循环运行掩膜API时,通过设置start与end参数,只运行一部分参数,编写多个脚本分别运行。便可以同时处理多个文件,提高效率。本例中,若只运行一个脚本需要70多个小时,同时运行7个脚本只需要11个小时左右。

     1 inpath = "your input file's path"
     2 outpath = "your output file's path"
     3 inf = "mask file's path"
     4 start = 0
     5 end = 10
     6 
     7 os.chdir(inpath)
     8 
     9 # Set the current workspace
    10 arcpy.env.workspace = (inpath)
    11 # Set the snapRaster
    12 arcpy.env.snapRaster = (inf)
    13 # Check out the ArcGIS Spatial Analyst extension license
    14 arcpy.CheckOutExtension("Spatial")
    15 
    16 para = pre_parameter(inpath, outpath, inf)
    17 
    18 StartTime = time.time()
    19 print('start Mask from %d to %d'%(start, end))
    20 
    21 for i in range(start, end): # 这里根据文件数量改动,可以分几部分打开多个shell运行多个脚本提高速度
    22     time1 = time.time()
    23     Extract_by_Mask(para[i])
    24     time2 = time.time()
    25     print(i, 'has finished! costed ' + str(time2 - time1) + ' Seconds...',)
    26 
    27 EndTime = time.time()
    28 print('Elapsed: ' + str(EndTime - StartTime) + ' Seconds...')

    2 批处理文件(.bat)

    下面是.bat文件编写思路

    cd/d C:Python27ArcGIS10.2 
    
    start cmd /k python.exe C:aaadesktopscript_1.py
    
    choice /t 3 /d y
    
    start cmd /k python.exe C:aaadesktopscript_2.py
    
    …………
    
    choice /t 3 /d y
    
    start cmd /k python.exe C:aaadesktopscript_n.py

    命令编写参考了博客 https://www.cnblogs.com/fangjb/p/13275210.html

    第一句 要设置为你的Arcpy python.exe所在路径

    一些解释如下:

    代码结尾不加pause的原因是,执行完关闭窗口,因为不需要该窗口保留着,免得手动关闭。

    1. start 用来启动一个应用

    2. cmd /k 表示cmd后面的命令执行完后不关闭窗口。如果要在执行完成后关闭窗口可以用/c

    3. cd /d 表示运行到该目录下

    4. 使用choice命令来延时3秒,也可用ping命令作延时,ping 127.0.0.1 -n 5

    在命令窗口输入choice/? 以查看更多choice命令的用法.

    上面的思路肯定不是最优解决办法,欢迎牛人大佬朋友下方留言交流。

  • 相关阅读:
    PHP编程资源
    JSP+Java编程资源
    Word、Excel办公书的资源下载
    听你说
    一些好看的渐变色(配色)网站推荐
    js判断数组中是否包含某个元素
    你才是你故事的作者
    vue-color 颜色选择器插件用法介绍
    vue-cli3 导入.md文件,vue中markdown文件的解析与渲染
    新版 animate.css 在vue中的正确使用
  • 原文地址:https://www.cnblogs.com/yhpan/p/14458793.html
Copyright © 2011-2022 走看看