Python与批处理在遥感影像存储中的应用
2018-07-05廖小龙黄彦锋陈云波昆明理工大学国土资源工程学院云南昆明650000云南省测绘产品检测站云南昆明650000昆明市规划编制与信息中心云南昆明650500
廖小龙 施 昆* 黄彦锋 陈云波(昆明理工大学国土资源工程学院 云南 昆明 650000)(云南省测绘产品检测站 云南 昆明 650000)(昆明市规划编制与信息中心 云南 昆明 650500)
0 引 言
测绘资料作为国家经济建设发展的基础,需要根据事项的性质和特点对资料定密,明确保密期限[1],而不断增长的现代航摄遥感影像资料势必需要大量的存储空间。相对于冷数据的存储,热数据的存储需要大量的成本投入,包括购买费用和维护费用,比如:磁盘阵列和服务器等,而这些在冷数据的存储过程中显得多余,因为冷数据的使用与调用效率并不高。因此,使用怎样的方法存储和调用这些现代航摄遥感影像资料对每个管理部门都非常重要。
常用的冷存储方式有:磁带、光盘、硬盘存储。本文以数字正射影像图DOM(Digital Orthophoto Map)[2-4]为例,采用硬盘存储的方式,在Windows系统中用Python语言编写工具软件,并灵活运用批处理脚本[5-7],探寻几种高效率存储冷数据[8-9]的方法。
1 概念介绍
冷数据存储是指很少使用或访问的非活跃数据的存储。通常,冷数据即便不需要无限期保留,但出于业务或法规遵从性目的,也必须将其保留相当长一段时期。一般来说,冷数据存储要比用于支持更活跃数据的高性能主存储经济很多,具体的经济指标在本文中主要考虑存储的体积和备份的速度。
Python[10-13]是一门简单而又强大的编程语言,对于那些编程困难的人来说,Python的出现或许是一个福音。Python的主要特点如下:
简单且易学,它的语法简单,不需要耗费太多的精力;免费且开源;跨平台,支持包括Windows、Mac、Linux在内的各种平台;解释性,这一特点使得Python具有更强的移植性;Python是一门面向对象的编程语言[10]。
批处理是一种简化的脚本语言,它是由DOS(Disk Operating System)或者Windows系统内嵌的命令解释器解释运行。批处理文件的扩展名为bat,可以在不需要for、if等控制流程的情况下,批量地执行特定命令,非常方便。
2 测绘数据存储备份程序的设计
2.1 程序设计思路
如图1所示,首先对文件进行识别工作(遍历文件夹),然后生成对应的压缩文件,存储到指定位置,接着针对生成的压缩文件计算相应md5文件,并且以文本的形式保存,最后生成程序处理日志,便于后续文件处理的管理。
图1 流程图
2.2 Python在数据存储备份中的应用
Python的优点是有大量的第三方库可以导入。对文件遍历[14-15],可以使用os模块;生成压缩文件可以使用zipfle模块;生成md5文件有hashlib模块;针对单进程不能充分利用多核计算机CPU的情况,可以使用multiprocessing模块等。
2.2.1 文件遍历,生成完整源文件路径
使用os.walk遍历每一个文件,识别每一个需压缩文件的完整路径zipfilepath,将它们存储到filelist列表中。
2.2.2 压缩文件
使用zipfile模块将文件压缩到指定路径,该模块的使用和一般的文件读写类似,目标路径的存储名zipfilename是在zipfilepath的基础上,使用replace把源文件路径替换目标文件路径,末尾加上:“.zip”具体代码为:zipfilename=zipfilepath.replace(rootpath,destpath)+′.zip′;压缩函数核心代码为:zfile=zipfile.ZipFile(zipfilename,′w′,zipfile.ZIP_DEFLATED),第三个参数为压缩模式。
2.2.3 生成md5文件
使用hashlib模块生成md5值,首先用open方法打开文件,然后使用update方法更新,最后打开文本,写入更新的数据即可。
2.2.4 实现多进程(在上述功能封装成函数的前提下)
使用map方法省去for循环步骤,在使用中,一定要先执行pool.close(),然后再执行pool.join(),详细代码如下:
pool=Pool(2)
#括号内可设置进程数量,默认为CPU内核数量
pool.map(zip_dir,zipfilelist)
#实现多进程
pool.close()
pool.join()
2.2.5 生成日志
最简单方式是在处理过程输出一些信息,写到txt文件中。要求高的情况下可使用logging模块,使用起来也很简单。首先使用os.path.basename(__file__)来识别py文件的名称(为了使得日志路径和py文件路径保持一致),然后使用logging.basicConfig来定义日志输入格式,接着使用logging.info()来记录日志,通常可以使用Python中装饰器(闭包)来对每一个函数的执行情况进行记录。
2.3 批处理在数据存储备份中的应用
批处理虽然没有那么多模块可以导入,但它作为Windows操作系统自带的脚本语言在数据备份中也具备它独有的特点。
2.3.1 大量第三方软件的命令行可调用
批处理在进行压缩和生成md5文件都可以调用其他软件的命令行。常用的压缩软件有:WinRAR、HaoZip(好压)、7z、Exdupe等;生成md5文件可供选择的对象有:md5sums和Windows 系列操作系统Certutil命令等,比如:
exdupe的命令行:exdupe -t8 "!prjdir!\%%i" "!outdir!\%%i.full"
md5sums的命令行:md5sums -n D: emp>>%outdir%md
2.3.2 操作简单
直接使用多行命令行来实现批处理,使用软件UltraEdit将每一条软件的命令行编写排列在txt文档中,然后将文档后缀名修改为“.bat”,直接双击即可运行。将所有的命令行分成多个“.bat”文件即可实现多进程处理。
dir /b>list.txt即可生成压缩源文件列表到list.txt文本
2.4 Python调用工具软件
Python和批处理配合使用。Python不仅可以调用批处理的一些操作,比如2.3.2节提到的“dir /b>list.txt”,而且可以直接调用命令行。Python提供了两种选择用于调用命令行,其一是os模块,其二是管道subprocess模块。由于此次操作不需要得到调用后的返回值,所以代码中直接使用os.system,比如调用Exdupe命令行的方式如下:
os.system(""" Exdupe "{0}" "{1}" """.format(full_rootpath, full_destpath))#full_rootpath和full_destpath分别代表完整的源文件路径和目标文件路径。
2.5 意外事件的处理机制
Python文件处理非常方便,例如:os模块的makedirs函数创建文件夹,remove函数删除文件等。如图1中所述,通过对比源文件夹与目标文件夹中的文件,识别出已存在的文件,并在备份处理时忽略已有文件,避免重复备份。考虑到程序意外中断可能导致上次处理的最后生成的几个文件不完整,程序通过分析在目标文件夹中的文件,识别出未能完整备份的数据文件后将其删除,处理函数为:remove(targetpath)。
2.6 实验数据及其处理
图2中显示用于处理的数据:TIFF格式的1∶5 000 DOM,数据量33 GB,分别存储在413个文件夹中,文件夹平均大小为80 M。图3中显示已处理的数据,针对图2中的每个文件夹,在图3中都有两个文件与之对应,分别为压缩生成的文件(“.zip”文件)和记录压缩生成文件md5值的文本文件(“.txt”文件)。图4中显示使用Python调用logging模块生成的日志文件,文件记录着图2中每一个源文件夹对应的处理情况,若成功压缩备份,则记录为Mission completed,文件处理结果如图3所示。若处理失败,则记录处理原因,用于管理人员分析错误原因或者调试程序代码。
图2 待处理数据
图3 已处理数据
图4 数据处理日志
3 不同处理方法的比较分析
Python在多进程处理方面可直接利用自带模块,进行批处理时代码量较大,相对繁琐。
批处理是通过调用其他软件完成任务,可以灵活的让几个工具软件协同工作,代码量较少。前提是必须找到合适的工具软件。
实验以处理TIFF格式的1∶5 000 DOM为例,做效率对比。数据量33 GB,分别存储在413个文件夹中,文件夹平均大小为80 MB。台式计算机配置为:单8核CPU,3.40 GHz主频;RAM4.00 GB;64位Windows 7操作系统。由于不同软件都能设置不同的压缩等级,这意味着压缩率越高,结果体积越小,时间越长,本次实验除了Exdupe修改了默认压缩比,其他软件统一采用默认压缩比。处理结果详情如表1-表5所示。
表1 Python内置模块处理结果
表2 批处理与Exdupe配合处理结果
表3 批处理与7z配合处理结果
表4 批处理与WinRAR配合处理结果
表5 批处理与HaoZip配合处理结果
通过对Python程序处理(表1)和四个常用压缩软件批处理(表2到表5)的综合分析可以得出:
1) 无论哪一种备份处理,单进程处理所花费的时间大约是双进程的两倍。
2) 在本实验电脑配置的前提下,当进程数量超过双进程时,备份所花费的时间不减反增,而且进程越多,增加越明显。
3) 不同软件对内存和CPU的占用率也不一样,比如HaoZip、7z和Python处理中,内存和CPU占用率并不随进程数量增加而增加,Exdupe和WinRAR则恰恰相反,甚至在进程达到三个的时候,电脑出错,自动重启。
4) 由于进程数量过多,可能出现进程卡死的情况,比如:表5中HaoZip处理结果中,当进程数设置为8时,其中6个进程正常结束,另外两个进程卡死了。
5) 处理结果中时间最短的情况出现在表2 Exdupe处理结果中,总时间为909 s。总体积最小的情况出现在表4 WinRAR处理结果中,总大小为17.2 GB。综合考虑时间和总大小因素,最佳处理结果为表2中Exdupe的双进程处理:总大小17.9 GB,总时间909 s,不过该软件的不足在于:当需要解压时,也只能使用该软件。
综上特征考虑可以得出:在本实验电脑配置的前提下,5种处理方法中,设置双进程都是最佳条件。
通常在作业过程中,作业人员更希望在利用第三方程序的基础上,再添加一些功能,这样不仅可以减少编程量,还能实现所有需要的功能。因此,通过循环调用其他软件命令行的方法,进一步实验结果表现为:在表6中显示使用Python调用模块和第三方软件的处理结果,图5中显示出配合处理时只考虑时间因素情况下的对比结果,结果中可以看出:7z和WinRAR两款软件在被Python调用之后的效果并不明显,达不到批处理双进程的效果,而HaoZip和Exdupe则比较接近与批处理的双进程效果。另外,Python调用自带模块的处理速度也比较理想,仅次与Exdupe和HaoZip。而且,CPU和内存的占用率是最低的,对于一般作业者来说,选择Python调用自带模块在一定程度上也起到了保护电脑的作用。
表6 Python双进程调用其他软件的处理结果
图5 对比结果
4 结 语
从文中提到的几种遥感影像资料备份存储方法可得出如下结论:
1) 批处理的优点:调用其他具有命令行模式的软件,避免了造轮子的过程,简单便捷。
2) 大量的模块使得Python能够灵活地处理工作中遇到的问题。
3) “胶水”特性也使得Python能够帮助作业人员快速找到合适的处理方法,比如文中提到的调用第三方软件的命令行,在不需要单独造轮子的情况下,批量解决问题。
4) Python和批处理的配合使用可充分利用两者的优点,但是对用户的要求较高,用户需要同时掌握Python和批处理机制。
5) 除了文中提到的遥感影像资料存储工作,在其他的工作中,如若遇到有可调用的第三方软件,同样可以利用Python和批处理的方法来快速找到解决方案。
[1] 全国人大常委会办公厅.中华人民共和国保守国家秘密法[M].法律出版社,2010.
[2] 张海中.地理国情普查数字正射影像(DOM)数据生产及质量控制[J].东北水利水电,2014,32(12):62- 63.
[3] 马东岭,崔健,丁宁,等.一种数字正射影像图制作方法[J].测绘科学,2013,38(4):188- 189,199.
[4] 李华,李淑琴,王锦萍,等.利用数字摄影测量系统与遥感手段高效获取4D产品的技术[J].城市勘测,2005(2):34- 36.
[5] Van Wolverton. Running MS-DOS[M].20th Anniversary Edition.Microsoft Press,2002:5- 6.
[6] Gillay C Z,Peat B A.Windows Xp:Command Line[M].Franklin Beedle & Associates,2002:12- 16.
[7] Ford J L.Microsoft Windows Shell Script Programming for the Absolute Beginner[M].Course Technology PTR,2003.
[8] 柴云鹏,杨楠.冷数据集中的流媒体存储系统节能方法[J].计算机科学,2012,39(10):148- 151,169.
[9] 姜晓青,王钦若.大数据环境下冷数据存储技术概述[J].工业控制计算机,2016,29(6):58- 60.
[10] Eric Pimpler.Programming ArcGIS 10.1 with Python Cookbook[M].Birmingham:Packt Publishing Ltd,2013:7- 28.
[11] Zandbergen P A.Python Scripting for ArcGIS[M].Esri Press,2013.
[12] 胡红,赖鑫生.基于ArcGIS和Python集成开发可达性分析工具的研究[J].测绘工程,2016,25(11):43- 49.
[13] 周津津,陈少锋,刘晓娟.浅谈基于ArcGIS的影像处理工具集开发[J].测绘与空间地理信息,2014(11):155- 157.
[14] 陈秋晓,钱国栋.面向UPMIS的控规数据批量转换方法及实现[J].浙江大学学报(理学版),2013,40(5):606- 610.
[15] Lutz Mark.Learning Python[M].4th ed.O’Reilly Media,Inc.2009:583- 590.