批处理文件(.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:\Python27\ArcGIS10.2 start cmd /k python.exe C:\aaa\desktop\script_1.py choice /t 3 /d y start cmd /k python.exe C:\aaa\desktop\script_2.py ………… choice /t 3 /d y start cmd /k python.exe C:\aaa\desktop\script_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命令的用法.
上面的思路肯定不是最优解决办法,欢迎牛人大佬朋友下方留言交流。
批处理文件(.bat)并行Arcpy脚本提高效率的思路的更多相关文章
- 批处理文件 .bat 并行Arcpy脚本提高效率的思路-提升版
目录 前言 Arcpy脚本 导入库 函数定义 循环实现 批处理(.bat)脚本 前言 我在之前的博客园博客里,阐述了如何编写Arcpy脚本,如何利用Windows bat批处理脚本同时打开多个cmd窗 ...
- UVA12325-注意提高效率的思路
题目大意:你有一个体积为N的箱子和两种数量无限的宝物.宝物1的体积为S1,价值为V1:宝物2的体积为S2,价值为V2.输入均为32位带符号的整数.你的任务是最多能装多少价值的宝物? 方法:其实也没 ...
- 利用mock提高效率
利用mock提高效率 谈到mock,就不得不讲前后端分离.理想情况下前后端不分离,由全栈的人以product和infrastructure的维度进行开发,效率是最高的.近些年来业务的复杂度越来越高,真 ...
- sql的简单提高效率方法
少用in操作(效率极差),尽量用表关联代替 select要指定列,不要*(*会读入所有数据,而指定列则只提取涉及的列,减少io) 尽量有where(减少读取量),where操作列尽量有索引(加快查询) ...
- 【转】.NET程序员提高效率的70多个开发工具
原文:.NET程序员提高效率的70多个开发工具 工欲善其事,必先利其器,没有好的工具,怎么能高效的开发出高质量的代码呢?本文为各ASP.NET 开发者介绍一些高效实用的工具,涉及SQL 管理,VS插件 ...
- cmake:善用find_package()提高效率暨查找JNI支持
cmake提供了很多实用的cmake-modules,通过find_package()命令调用这些modules,用于写CMakeLists.txt脚本时方便的查找依赖的库或其他编译相关的信息,善用这 ...
- 让你提高效率的 Linux 技巧
想要在 Linux 命令行工作中提高效率,你需要使用一些技巧. 巧妙的 Linux 命令行技巧能让你节省时间.避免出错,还能让你记住和复用各种复杂的命令,专注在需要做的事情本身,而不是你要怎么做.以下 ...
- 提升jmeter脚本编写效率的方法:Fiddler导出jmx文件
有效提升编写JMeter脚本效率的方法 jmeter的脚本来源有以下几种:badboy录制.jmeter自带的录制功能.手动编写脚本(使用fiddler/wireshark来抓包,然后构造协议写脚本) ...
- 提高效率的Linux命令
提高效率的Linux命令 一.fc 二.disown 三.Ctrl + x +e 四.!! 两个感叹号 五.一次创建多个目录或文件 六.tee 七.删除从开头到光标处的命令文本 八.删除从光标到结尾处 ...
随机推荐
- 使用 CSS 轻松实现一些高频出现的奇形怪状按钮
背景 在群里会有同学问相关的问题,怎么样使用 CSS 实现一个内切角按钮呢.怎么样实现一个带箭头的按钮呢? 本文基于一些高频出现在设计稿中的,使用 CSS 实现稍微有点难度和技巧性的按钮,讲解使用 C ...
- [源码解析] PyTorch 分布式 Autograd (3) ---- 上下文相关
[源码解析] PyTorch 分布式 Autograd (3) ---- 上下文相关 0x00 摘要 我们已经知道 dist.autograd 如何发送和接受消息,本文再来看看如何其他支撑部分,就是如 ...
- 【CSP2019】【洛谷5657】格雷码
传送门:https://www.luogu.com.cn/problem/P5657 题意不再复述: 我们知道对于每个字符1 or 0: 只要考虑当前的k在2^n的前半段还是后半段就行 这里需要注意的 ...
- 自助分析工具Power BI的简介和应用
作为一名资深的IT技术人,特别喜欢学习和尝试新技术,也勇于接受挑战,勇于创新,不仅能发现问题,更要解决实际的疑难杂症,闲暇时光也乐于分享一些技术干货.记得2017年的时候,华章出版社的编辑通过网上找到 ...
- python-django-查询详解
倒数第二条性质可以实现链式的调用,通过第一次的过滤还可以再过滤倒数第一条就是结果集从数据库中查询出来之后不会再进行数据库的查询的我们使用的object就是模型管理器manager的一个对象 obj = ...
- rabbit mq的php使用 php-amqplib操作消息队列
rabbit mq的php使用 php-amqplib操作消息队列 有大神翻译的教程,非常清楚可以参考: https://xiaoxiami.gitbook.io/rabbitmq_into_chin ...
- 45-Letter Combinations of a Phone Number
Letter Combinations of a Phone Number My Submissions QuestionEditorial Solution Total Accepted: 7855 ...
- 关于蓝牙Mesh您必须知道的七件事
蓝牙技术联盟于7月19日正式宣布,蓝牙(Bluetooth)技术开始全面支持Mesh网状网络.全新的Mesh功能提供设备间多对多传输,并特别提高构建大范围网络覆盖的通信能力,适用于楼宇自动化.无线传感 ...
- CentOS6忘记root密码如何重置
CentOS6忘记root密码,如何重置密码 ① 重启服务器,按"e"键进入修改系统开机项界面 ② 选择内核项,按"e"进入其中进行配置 在文件内 ...
- ChromeDriver的安装和使用
用于驱动Chrome浏览器,适用于有界面的操作系统. 一.安装ChromeDriver 要先安装Chrome浏览器,然后安装ChromeDriver. 官方网站:https://sites.googl ...