廖小龍 施 昆* 黃彥鋒 陳云波(昆明理工大學國土資源工程學院 云南 昆明 650000)(云南省測繪產品檢測站 云南 昆明 650000)(昆明市規劃編制與信息中心 云南 昆明 650500)
測繪資料作為國家經濟建設發展的基礎,需要根據事項的性質和特點對資料定密,明確保密期限[1],而不斷增長的現代航攝遙感影像資料勢必需要大量的存儲空間。相對于冷數據的存儲,熱數據的存儲需要大量的成本投入,包括購買費用和維護費用,比如:磁盤陣列和服務器等,而這些在冷數據的存儲過程中顯得多余,因為冷數據的使用與調用效率并不高。因此,使用怎樣的方法存儲和調用這些現代航攝遙感影像資料對每個管理部門都非常重要。
常用的冷存儲方式有:磁帶、光盤、硬盤存儲。本文以數字正射影像圖DOM(Digital Orthophoto Map)[2-4]為例,采用硬盤存儲的方式,在Windows系統中用Python語言編寫工具軟件,并靈活運用批處理腳本[5-7],探尋幾種高效率存儲冷數據[8-9]的方法。
冷數據存儲是指很少使用或訪問的非活躍數據的存儲。通常,冷數據即便不需要無限期保留,但出于業務或法規遵從性目的,也必須將其保留相當長一段時期。一般來說,冷數據存儲要比用于支持更活躍數據的高性能主存儲經濟很多,具體的經濟指標在本文中主要考慮存儲的體積和備份的速度。
Python[10-13]是一門簡單而又強大的編程語言,對于那些編程困難的人來說,Python的出現或許是一個福音。Python的主要特點如下:
簡單且易學,它的語法簡單,不需要耗費太多的精力;免費且開源;跨平臺,支持包括Windows、Mac、Linux在內的各種平臺;解釋性,這一特點使得Python具有更強的移植性;Python是一門面向對象的編程語言[10]。
批處理是一種簡化的腳本語言,它是由DOS(Disk Operating System)或者Windows系統內嵌的命令解釋器解釋運行。批處理文件的擴展名為bat,可以在不需要for、if等控制流程的情況下,批量地執行特定命令,非常方便。
如圖1所示,首先對文件進行識別工作(遍歷文件夾),然后生成對應的壓縮文件,存儲到指定位置,接著針對生成的壓縮文件計算相應md5文件,并且以文本的形式保存,最后生成程序處理日志,便于后續文件處理的管理。

圖1 流程圖
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中裝飾器(閉包)來對每一個函數的執行情況進行記錄。
批處理雖然沒有那么多模塊可以導入,但它作為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文本
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分別代表完整的源文件路徑和目標文件路徑。
Python文件處理非常方便,例如:os模塊的makedirs函數創建文件夾,remove函數刪除文件等。如圖1中所述,通過對比源文件夾與目標文件夾中的文件,識別出已存在的文件,并在備份處理時忽略已有文件,避免重復備份。考慮到程序意外中斷可能導致上次處理的最后生成的幾個文件不完整,程序通過分析在目標文件夾中的文件,識別出未能完整備份的數據文件后將其刪除,處理函數為:remove(targetpath)。
圖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 數據處理日志
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 對比結果
從文中提到的幾種遙感影像資料備份存儲方法可得出如下結論:
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.