對於在運行過程當中只用到一次,可是會嚴重影響運行效率的數據,在使用事後馬上刪除,以提升運行效率。數組
遙感影像信息提取中,有預判、審覈兩步。對於同一塊地區,預判做業員先勾畫出目標地物並賦值,完成以後複製一份矢量交給審覈做業員檢查,審覈做業員在預判的基礎上修改圖斑形狀、屬性,或者刪除、添加圖斑。測試
如今須要對比兩份矢量,計算預判做業員的錯誤率、遺漏率,主體代碼很簡單,就是遍歷審覈後的矢量(審覈矢量),找出每一個圖斑對應的預判矢量圖斑,比較。若是找不到對應的圖斑,則認爲是遺漏。spa
shapeChange = attrChange = missing = 0; ISpatialFilter preFilter = new SpatialFilterClass(); preFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelWithin; IFeature chkFeat = null; IFeatureCursor chkCur = chkClass.Search(null, false); while ((chkFeat = chkCur.NextFeature()) != null) { IArea chkArea = chkFeat.Shape as IArea; preFilter.Geometry = chkArea.LabelPoint; IFeatureCursor preCur = preClass.Search(preFilter, false); IFeature preFeat = preCur.NextFeature(); if (preFeat == null) { missing++; continue; } IRelationalOperator relOp = chkFeat.Shape as IRelationalOperator; object preAttr = preFeat.get_Value(preIndex); object chkAttr = chkFeat.get_Value(chkIndex); //開始圖形比較 if (!relOp.Equals(preFeat.Shape)) { shapeChange++; continue; } if (!preAttr.Equals(chkAttr)) { attrChange++; continue; } }
這段代碼在圖斑數量不上萬的狀況下運行良好,然而圖斑數量變多以後效率急速降低,兩份5萬左右的矢量,一晚上都沒比較完。通過排查,時間開銷最大的是空間查找對應圖斑這段代碼。所以我試着在圖形比較以前添加如下代碼,刪除與審覈圖斑屬性形狀都相同的預判圖斑。code
if (relOp.Equals(preFeat.Shape) && preAttr.Equals(chkAttr)) { preFeat.Delete(); continue; }
結果原先一晚上跑不完的數據只用了半小時就搞定。blog
這裏就是我想要說的思路,對於在運行過程當中只用到一次,可是會嚴重影響運行效率的數據,在使用事後馬上刪除,以提升運行效率。utf-8
想到這個思路後兩天,又遇到了一個數據量很大的需求。有一份矢量,要求其中一個字段裏的值不能有重複,可是檢查以後發現有1萬多圖斑的值有重複,須要找出這1萬多圖斑。個人實現代碼以下:rem
# coding:utf-8 import os import arcpy orishp=arcpy.GetParameterAsText(0) uniquefd==arcpy.GetParameterAsText(1) scur=arcpy.da.SearchCursor(orishp,[uniquefd]) allvalues=[row[0] for row in scur] dcur=arcpy.da.UpdateCursor(orishp,[uniquefd]) for row in dcur: if allvalues.count(row[0])==1: allvalues.remove(row[0]) dcur.deleteRow()
倒數第二行,我把數組裏只出現一次的值都刪除,使執行allvalues.count()所需的時間逐次減小,以提升效率。get
用一份40萬個圖斑的矢量測試,以上代碼須要16分鐘,把倒數第二行註釋以後再測試,須要30分鐘,消耗的時間增長了幾乎一倍。it
最近遇到的業務量愈來愈大,若是有其餘好的提升效率的方法,但願你們多指點。io