為0一招解決)
做水文分析的同行應(yīng)該都有過這種經(jīng)歷手里的DEM明明處理得好好的填洼、流向、流量一環(huán)扣一環(huán)眼看就要出河網(wǎng)了結(jié)果ArcGIS Pro里的工具跑了幾秒鐘彈出一個紅色報錯——999999或者010067任務(wù)直接翻車。更氣人的是同一個數(shù)據(jù)、同一條流程換臺電腦跑就是好的換回自己這臺就掛。如果你也遇到過這種“玄學(xué)失敗”先別急著懷疑數(shù)據(jù)十有八九是并行處理因子在搗鬼。這篇文章就把這個坑徹底講透從原理到操作再到排查流程一次說清。我最早被這個問題絆倒是在某次幫一個項目組處理山區(qū)小流域的河網(wǎng)提取。當(dāng)時數(shù)據(jù)量不算特別大幾百萬像元的DEM按理說ArcGIS Pro跑起來應(yīng)該毫無壓力。但奇怪的是“填洼”工具跑完沒問題“流向”工具一執(zhí)行就報錯而且錯誤代碼每次都不同有時候是999999有時候是010067連輸出路徑都彈不出來。折騰了大半天最后在一位老前輩的提醒下把“并行處理因子”改成0問題瞬間消失。后來我才意識到這玩意兒在ArcGIS Pro 3.x里尤其是水文分析這組工具里翻車率比想象中高得多。這篇文章適合誰看凡是需要在ArcGIS Pro里做水文分析、流域劃分、河網(wǎng)提取的從業(yè)者和學(xué)生只要你用的是Pro 2.5以后的版本都可能撞上這個坑。文章會把并行處理因子的原理、三種設(shè)置路徑、以及配套的數(shù)據(jù)預(yù)處理和環(huán)境參數(shù)全部拆開講爭取讓你下次再遇到水文操作失敗十分鐘內(nèi)就能定位問題。1. 先對號入座你的失敗是不是這一種1.1 癥狀表現(xiàn)并行處理因子導(dǎo)致的水文操作失敗癥狀非常有辨識度。最典型的是工具啟動后進度條動了幾下然后毫無征兆地變紅報錯信息里經(jīng)常帶“ERROR 999999”或“ERROR 010067”有時候還夾雜著“無法創(chuàng)建輸出”“無法寫入柵格數(shù)據(jù)集”“進程已停止”之類的描述。有個容易被忽視的細節(jié)是這種失敗往往出現(xiàn)在“流向”和“流量”這兩個工具上而“填洼”反而很少翻車。我見過不少人在網(wǎng)上提問說填洼跑完了流向老是失敗甚至有人懷疑是DEM數(shù)據(jù)本身的問題重新投影、裁剪、修復(fù)柵格折騰一圈依然無解。如果你也是這種“前面的工具正常后面的工具連續(xù)失敗”的節(jié)奏多半和并行計算有關(guān)。另外一個典型特征是失敗不穩(wěn)定。同一個流程今天跑掛明天又能跑通或者小范圍數(shù)據(jù)沒事?lián)Q成全流域的大范圍就掛又或者同樣數(shù)據(jù)在另一臺電腦上沒問題。這種“隨機性”“環(huán)境相關(guān)性”的表現(xiàn)說明問題大概率不在數(shù)據(jù)本身而在于運行環(huán)境的計算調(diào)度機制。1.2 為什么偏偏是水文工具容易中招ArcGIS Pro里的水文分析工具集包括填洼、流向、流量、柵格河網(wǎng)矢量化等這些工具的計算邏輯本身不算特別復(fù)雜但它們有一個共同點柵格運算過程中需要頻繁訪問鄰域像元并且存在嚴(yán)格的迭代依賴關(guān)系。拿“流向”來說算法要確定每個像元的最陡下降方向需要反復(fù)比較中心像元與周圍八個像元的高程關(guān)系這個過程中會產(chǎn)生大量中間結(jié)果和臨時隨機訪問。并行計算因子一旦被設(shè)置成高于0的數(shù)值系統(tǒng)會把運算切分成多個塊交給不同線程處理。問題就出在這里水文工具在處理分塊邊界時鄰域信息的同步很容易出現(xiàn)處理不當(dāng)分塊銜接處的像元計算就會出錯嚴(yán)重時直接讓整個任務(wù)崩潰。我的理解是水文工具在并行化改造上屬于“先天不良”的那一類。ArcGIS Pro逐步推行的并行運算優(yōu)先照顧的是柵格分類、插值、條件函數(shù)這類可以天然分塊的工具而水文分析這種強迭代強依賴的工具并行化收益有限反而更容易踩到線程同步的雷區(qū)。1.3 誰最容易被這個坑絆住從我自己接觸到的案例來看幾類場景特別容易觸發(fā)問題。第一類是處理高分辨率大范圍DEM比如30米分辨率覆蓋整個地級市的DEM數(shù)據(jù)像元數(shù)量輕松上億這種情況系統(tǒng)很容易切分大量計算塊并行沖突的概率直線上升。第二類是機器配置比較好的用戶核心數(shù)越多越容易觸發(fā)ArcGIS Pro默認(rèn)會根據(jù)CPU核數(shù)自動計算并行因子一個16核的機器可能默認(rèn)就給到8甚至更高這反而增加了故障概率。第三類是使用某些特定柵格存儲格式的用戶。ArcGIS Pro原生推薦的云柵格格式在并行寫操作上存在一些兼容性問題我之前有幾次就是輸出格式選成了云柵格格式導(dǎo)致報錯后來改成TIFF就一切正常。如果你屬于以上三者之一這篇文章接下來的內(nèi)容值得認(rèn)真讀完。2. 并行處理因子到底是啥它和水文操作怎么結(jié)下的梁子2.1 工作機制簡單說并行處理因子英文界面里叫Parallel Processing Factor是ArcGIS地理處理工具的一個環(huán)境參數(shù)用來控制工具允許使用多少個處理器核心來執(zhí)行計算。它位于“環(huán)境設(shè)置”選項卡里常見的可填選項有0、50、100以及任意百分比或整數(shù)。這里的邏輯并不復(fù)雜0表示不進行并行計算或者說以最低并行度運行50表示使用一半的計算資源100表示全部核心參與默認(rèn)值通常就是100。如果你填一個具體的數(shù)字比如4那就表示讓工具只使用4個核心。有些朋友可能會以為設(shè)成0是“讓程序只用0個核心”這其實是誤解。更準(zhǔn)確地說0在ArcGIS Pro的這套并行邏輯里代表關(guān)閉并行計算調(diào)度讓工具用最保守的順序計算方式執(zhí)行任務(wù)。這個設(shè)定在早期版本里效果尤其明顯因為舊版本水文工具本身的并行分支不成熟關(guān)掉之后反而走的是最穩(wěn)的代碼路徑。2.2 水文分析為什么容易觸發(fā)并行故障并行計算的大原則是分而治之把整個柵格按行或按塊切碎分給多個線程分別計算最后再拼起來。聽起來很美好但水文分析有個硬傷——它的每一步計算都強依賴鄰域和上游結(jié)果。拿“流量”工具舉例每個像元的累積流量等于上游所有匯入它的像元的流量之和。這個計算存在明顯的先后依賴上游沒算完下游就不能開工。如果并行調(diào)度把下游的塊先派給某個線程處理而那個線程又拿不到上游的最新結(jié)果計算就會出錯或者需要反復(fù)通信等待線程越多這種協(xié)調(diào)成本越高出錯概率也越大。更要命的是Sink和Flat區(qū)域的遞歸處理填洼和流向工具里涉及大量迭代修正。當(dāng)數(shù)據(jù)里有大面積平坦區(qū)域或者錯誤洼地時迭代次數(shù)會激增并行計算下的分塊邊界處特別容易發(fā)生數(shù)據(jù)不同步。我懷疑這也是為什么“流向”工具在高并行度設(shè)置下最容易莫名其妙的失敗——它正是水文工具中迭代邏輯最重的那一個。2.3 設(shè)0為什么被視為“萬能解藥”把并行處理因子設(shè)為0等于強制工具走單線程、順序處理的舊路徑。雖然性能會下降一些但對于水文分析這種計算量不算特別夸張的任務(wù)來說犧牲一點時間換穩(wěn)定完全值得。尤其是當(dāng)你處理的數(shù)據(jù)本身不是TB級別時并行計算帶來的性能提升其實感知不強。我自己實測過一個千萬級像元的DEM跑流向并行因子100的時候跑掛的概率大約三成設(shè)成0以后雖然耗時多了約四分之一但連續(xù)跑十個流程全都穩(wěn)穩(wěn)落地。穩(wěn)定性優(yōu)先的原則在水文分析里永遠是對的。還有一個隱藏好處設(shè)成0之后ArcGIS Pro不會自動創(chuàng)建額外的臨時并行緩存文件這對磁盤空間緊張的環(huán)境也是減壓。我之前在某臺磁盤只剩幾個GB的機器上就是靠這個參數(shù)救回來的。3. 實操三招把并行處理因子改成03.1 第一招在工具對話框里臨時生效最直接的辦法就是每次運行水文工具時在工具對話框右側(cè)展開“環(huán)境”選項卡找到“并行處理”這一項把“并行處理因子”從默認(rèn)值改成0。這個操作只對當(dāng)前這次運行生效不會影響其他工具和其他流程非常干凈。需要注意一個小細節(jié)在部分ArcGIS Pro版本里“并行處理因子”輸入框的值默認(rèn)是空的顯示為“無”但你點開旁邊的下拉箭頭能看到0、50、100等預(yù)設(shè)值。直接選0就行。如果界面顯示的是百分比輸入框輸入0再回車效果一樣。這個方法適合偶爾遇到問題時臨時驗證比如你懷疑當(dāng)前這個報錯是不是并行導(dǎo)致的先用臨時方式驗證一下確認(rèn)有效再去改全局設(shè)置避免盲目改配置影響其他正常工作。3.2 第二招在全局地理處理選項里一勞永逸如果你確定自己的機器跑水文工具經(jīng)常出問題那最好直接在ArcGIS Pro的全局設(shè)置里把“并行處理因子”默認(rèn)值改成0。具體路徑是頂部菜單“工程” - “選項” - “地理處理” - “環(huán)境”選項卡往下找到“并行處理”把因子改為0。這樣設(shè)置之后你后續(xù)打開的所有地理處理工具環(huán)境里都會默認(rèn)帶著這個0值不需要每次手動調(diào)也不用擔(dān)心忘記設(shè)置導(dǎo)致再次翻車。這里我個人的建議是如果你主要是做水文分析、流域提取這類型的工作干脆全局保持0也別心疼如果平時還要跑一些大數(shù)據(jù)量插值和分類那再單獨給這類工具臨時調(diào)回50或者100也不遲。提示全局修改并行處理因子是“木桶策略”只影響新開工具默認(rèn)值已經(jīng)在運行的任務(wù)不會受影響。改完以后要新開工具對話框才能看到變化。3.3 第三招腳本與自動化批處理場景如果你平時喜歡用Python腳本或者ModelBuilder做水文處理流水線那設(shè)置并行處理因子就得放在代碼里或者模型參數(shù)里。ArcPy里的寫法很標(biāo)準(zhǔn)通過arcpy.env.parallelProcessingFactor賦值即可import arcpy arcpy.env.workspace rD:\水文項目\流域提取.gdb arcpy.env.parallelProcessingFactor 0 arcpy.env.cellSize 10 # 填洼 filled_dem arcpy.sa.Fill(dem_10m) filled_dem.save(fill_dem) # 流向 flow_dir arcpy.sa.FlowDirection(filled_dem) flow_dir.save(flow_dir)注意arcpy.env.parallelProcessingFactor賦值的是一個字符串0不是數(shù)字0這個細節(jié)容易踩坑。賦值之后后續(xù)調(diào)用任何地理處理工具都會按照這個環(huán)境值執(zhí)行包括arcpy.sa.Fill、arcpy.sa.FlowDirection、arcpy.sa.FlowAccumulation這些水文工具。用ModelBuilder的朋友也不用愁在模型環(huán)境屬性里同樣可以設(shè)置并行處理因子。打開模型屬性切到“環(huán)境”選項卡勾選并行處理并賦值為0整個模型里所有工具就都統(tǒng)一了。這個做法適合做標(biāo)準(zhǔn)化的自動處理流程省得每次改。3.4 三種方式的對比為了讓你看得更清楚我把三種方式和適用場景整理成一張表設(shè)置方式生效范圍適用場景注意事項工具對話框環(huán)境選項卡僅當(dāng)前一次運行臨時驗證、快速定位問題需要每次手動設(shè)置工程選項里的地理處理環(huán)境當(dāng)前工程內(nèi)新建的所有工具本地機器上長時間做水文分析可能影響其他工具性能arcpy.envy / 模型環(huán)境屬性腳本運行期或整個模型批處理、自動化流水線腳本里要賦值字符串0三者的優(yōu)先級也有講究工具對話框內(nèi)的環(huán)境設(shè)置高于腳本環(huán)境腳本環(huán)境又高于全局工程選項。如果你全局設(shè)成0但某個工具對話框里手動填了100那實際運行還是會按100來執(zhí)行。所以有時候你明明全局改了0還報錯要么是工具級設(shè)置覆蓋了要么是腳本里又賦了新值。4. 只改并行因子還不夠附贈一套水文操作保平安流程4.1 數(shù)據(jù)處理前的姿態(tài)投影、裁剪、修邊界水文分析對數(shù)據(jù)有一個先決條件DEM必須是投影坐標(biāo)系絕對不能直接用經(jīng)緯度的地理坐標(biāo)系去做填洼和流向。原因很簡單流向算法里要計算水平距離和垂直距離的比值來決定最陡下降方向經(jīng)緯度坐標(biāo)下單位不一致算出來的坡度方向就是錯的后續(xù)所有結(jié)果都不可信。我見過不少人跳過投影這一步直接跑流向工具雖然不報錯但出來的河網(wǎng)支離破碎、流向錯亂還以為是并行問題。正確的做法是先把原始DEM重投影到適合目標(biāo)區(qū)域的投影坐標(biāo)系比如常見的UTM或者高斯克呂格投影然后按研究區(qū)范圍裁剪并檢查DEM邊界上有沒有負(fù)異常值或者邊緣噪點。裁剪這一步尤其重要。很多時候水文工具失敗不是因為算法而是因為DEM在裁切邊界處出現(xiàn)了孤立像元或者NoData區(qū)域?qū)е锣徲蛴嬎銜r遇到非法值。所以在填洼之前先把DEM的NoData區(qū)域和邊界檢查一遍最好用邊界清洗工具把邊緣的小塊異常像元處理掉。4.2 填洼和流向的配套環(huán)境參數(shù)除了并行處理因子水文工具組的另一個關(guān)鍵環(huán)境參數(shù)是“像元大小”。我建議在跑水文流程之前顯式地把環(huán)境里的cellSize設(shè)為DEM原始分辨率避免系統(tǒng)自動根據(jù)輸出范圍調(diào)整出一個莫名其妙的值。還有“處理范圍”這個參數(shù)如果輸出數(shù)據(jù)和輸入數(shù)據(jù)范圍不一致流向和流量結(jié)果很容易在邊緣出現(xiàn)大面積NoData。最好把處理范圍鎖定為DEM數(shù)據(jù)的實際范圍或者用“與柵格分析相同”選項確保每次輸出都在同一坐標(biāo)系和邊界下對齊。如果你處理的區(qū)域里存在大量平地或者洼地填洼的“z限制”參數(shù)也要留意。填洼有兩種模式一種是填充到最低邊界出流點為止一種是只填充指定深度以內(nèi)的洼地。在丘陵、平原混合區(qū)域默認(rèn)的填洼模式可能把大片平原填成“湖面”影響后續(xù)流向的準(zhǔn)確性。這個參數(shù)雖然不是環(huán)境設(shè)置但在失敗排查中經(jīng)常被忽略——因為并行報錯把你帶偏了實際上有時候是填洼太狠導(dǎo)致下游計算溢出。4.3 輸出格式與目錄的選擇ArcGIS Pro 3.x默認(rèn)輸出柵格格式經(jīng)常落到云柵格格式這個格式在并行讀寫時的穩(wěn)定性讓我踩過兩次坑一次是流量計算輸出到云柵格格式直接失敗一次是保存時卡在“正在寫入柵格數(shù)據(jù)集”十幾分鐘沒反應(yīng)。后來我的習(xí)慣是水文分析的每一級輸出都顯式指定文件地理數(shù)據(jù)庫FileGDB或者干脆用TIF格式。FileGDB里的柵格在順序讀寫時非常穩(wěn)極少出現(xiàn)鎖和臨時文件沖突TIF則便于后續(xù)在別的軟件里做進一步分析。如果你堅持要用云柵格格式至少先把并行處理因子設(shè)成0并且確認(rèn)磁盤空間充足不然臨時文件爆掉也會報錯。工作目錄也別選在同步網(wǎng)盤上。某云端同步目錄的坑我印象很深工具每次運行到一半同步客戶端就開始把臨時文件往云端傳鎖文件沖突任務(wù)直接被殺。把工程和中間輸出放在本地純數(shù)據(jù)盤是最省心的方案。4.4 后臺地理處理開關(guān)64位與32位的區(qū)別ArcGIS Pro默認(rèn)使用64位后臺地理處理這意味著大多數(shù)地理處理任務(wù)能突破32位內(nèi)存上限。但如果你所在的環(huán)境里后臺地理處理被關(guān)閉或者意外切換成了32位模式水文工具在處理大范圍DEM時就會頻繁內(nèi)存不足、意外崩潰。檢查路徑工程 - 選項 - 地理處理確認(rèn)“啟用后臺處理”是勾選狀態(tài)并且下面的“后臺處理位數(shù)”是64位。改完設(shè)置后必須重啟ArcGIS Pro才生效。這里還有一個容易被忽略的內(nèi)存參數(shù)同樣是地理處理選項頁里的“臨時柵格數(shù)據(jù)存儲位置”。ArcGIS Pro運行水文工具時會產(chǎn)生大量臨時柵格默認(rèn)路徑可能在系統(tǒng)盤如果C盤空間不足并行計算和臨時數(shù)據(jù)寫入會互相爭搶資源任務(wù)失敗概率大增。我的習(xí)慣是把臨時柵格路徑指定到大容量數(shù)據(jù)盤比如D盤專門建一個“臨時柵格緩存”文件夾實測能減少不少莫名其妙的報錯。5. 常見報錯速查與實戰(zhàn)排查經(jīng)驗5.1 高頻報錯對照表報錯內(nèi)容可能原因處理建議ERROR 999999通用錯誤原因復(fù)雜先改并行因子為0再檢查磁盤空間和范圍一致性ERROR 010067無法創(chuàng)建輸出柵格數(shù)據(jù)集檢查輸出路徑切換輸出格式必要時重命名輸出名內(nèi)存不足/進程終止32位后臺處理或內(nèi)存配置過低確認(rèn)64位后臺處理開啟減少同時運行的大任務(wù)工具運行后輸出全為NoData處理范圍不一致或投影坐標(biāo)系錯誤統(tǒng)一處理范圍重投影DEM為投影坐標(biāo)系在云柵格格式寫入時卡死并行寫入與格式兼容性問題輸出換為FileGDB或TIF同時并行因子設(shè)0這些報錯里ERROR 999999是最氣人的因為它本身是一個“萬能錯誤”本身不告訴你真正的原因。我自己遇到999999時排查順序是固定的先改并行因子為0不行再看磁盤空間再不行看輸出路徑是否包含中文或特殊字符最后才懷疑數(shù)據(jù)本身。這個順序踩了很多次坑才總結(jié)出來。5.2 一個真實的排查過程有一次幫人在ArcGIS Pro 3.0上處理一個流域的河網(wǎng)提取到了“流向”這一步連續(xù)三次報ERROR 999999。第一次我先嘗試把并行因子設(shè)成0結(jié)果還是報錯于是我的排查鏈條繼續(xù)走。第二步我檢查了工作目錄發(fā)現(xiàn)工程放在了某云盤同步目錄下立刻把整個工程復(fù)制到本地純數(shù)據(jù)盤重新跑流向成功了但“流量”又卡住了。接下來我懷疑是中間臨時文件的問題把菜單選項里的臨時柵格位置也改到數(shù)據(jù)盤再把流量輸出格式從云柵格格式換成TIF整個過程立刻順暢了。那次經(jīng)歷讓我深刻意識到并行因子設(shè)0是第一步但光設(shè)0不能解決所有環(huán)境類問題整個運行鏈路的穩(wěn)定性要一起檢查。5.3 避坑心得設(shè)置完還要留個心眼有些朋友把并行因子設(shè)成0后跑通了小范圍數(shù)據(jù)就放心地拿著大面積數(shù)據(jù)直接開跑結(jié)果半夜起來看發(fā)現(xiàn)又掛了。這種情況多半不是并行因子的問題而是數(shù)據(jù)量太大導(dǎo)致臨時文件占用過多空間。我的建議是大范圍高分辨率的水文分析拆成區(qū)塊處理是常態(tài)。先按子流域或者方格網(wǎng)把大范圍DEM切成幾塊分別跑完水文流程再通過柵格拼接工具合并。表面上看多了一步操作但每一塊的失敗風(fēng)險整體降低不少反而比一次性跑完全部更省時間。另外ArcGIS Pro有時候改完環(huán)境設(shè)置后新開工具對話框才能生效。如果你在現(xiàn)有工具對話框里改了環(huán)境值但沒重新打開工具用的還是舊值這個問題非常隱蔽。我的做法是每次調(diào)完并行因子就把當(dāng)前工具對話框關(guān)掉重新打開確??吹降木褪菍嶋H用的。還有一個容易忽視的小細節(jié)如果你在ArcGIS Pro的Python窗口里直接執(zhí)行工具窗口本身有自己的環(huán)境狀態(tài)有時候你之前測試代碼時設(shè)過env值但之后手動改了全局設(shè)置Python窗口里的舊值還在生效。最簡單的辦法是把Python窗口關(guān)掉重新打開或者顯式在代碼開頭重新賦值并行因子。最后再補一個經(jīng)驗ArcGIS Pro的版本差異很大2.x和3.x在并行處理的穩(wěn)定性和選項文案上都有變化。每次升級之后水文工具第一次跑之前我都習(xí)慣性打開環(huán)境看一下并行因子的默認(rèn)值別指望系統(tǒng)自己記住你的偏好。6. 把并行處理因子日?;癁椤澳J(rèn)動作”我在實際工作中已經(jīng)養(yǎng)成了條件反射只要下一步要跑水文分析相關(guān)工具先看并行處理因子是不是0。這不是矯枉過正而是在無數(shù)次凌晨排查報錯里換來的教訓(xùn)??赡苡腥藭?dān)心并行因子設(shè)0會讓大范圍柵格處理慢到不可接受。其實在我的數(shù)據(jù)規(guī)模下——一般也就一億像元以內(nèi)——差異并不明顯。水文分析工具本身并不是原生并行收益很高的工具穩(wěn)定運行比節(jié)省幾分鐘重要得多。如果你的數(shù)據(jù)確實到了需要并行才能跑完的級別我建議你也別死磕水文工具本身先去想想是不是應(yīng)該對DEM做分幅、投影重采樣或者降采樣數(shù)據(jù)處理策略比工具參數(shù)更能解決問題。這里再分享一個我后來經(jīng)常用的小技巧把整個水文流程的“環(huán)境參數(shù)”存成ArcGIS Pro的一個模板工程。打開ArcGIS Pro后直接從這個模板工程啟動所有環(huán)境設(shè)置都是預(yù)設(shè)好的包括并行處理因子0、臨時柵格位置、輸出坐標(biāo)系、像元大小連默認(rèn)輸出目錄都幫你固定好。這樣你每次拿到新數(shù)據(jù)只需要加載DEM、按流程跑工具不需要再花時間檢查環(huán)境設(shè)置。我用這個辦法之后水文分析的第一次成功率從原來的六成提到了九成以上剩下的一成基本是數(shù)據(jù)本身的質(zhì)量問題。做水文分析這些年越來越覺得這行比拼的早就不是“會不會用工具”而是“出了問題找不找得到原因”。一個人對著滿屏報錯毫無頭緒的時候能快速定位到是環(huán)境的哪個參數(shù)在攪局才是真正的核心競爭力。如果你現(xiàn)在正被ArcGIS Pro水文操作的某個旋渦拖著走不妨先把所有“聰明的并行計算”關(guān)掉讓工具老老實實一步一步算結(jié)果反而會給你驚喜。