大量數據處理的一個思路

    對於在運行過程當中只用到一次,可是會嚴重影響運行效率的數據,在使用事後馬上刪除,以提升運行效率。數組

    遙感影像信息提取中,有預判、審覈兩步。對於同一塊地區,預判做業員先勾畫出目標地物並賦值,完成以後複製一份矢量交給審覈做業員檢查,審覈做業員在預判的基礎上修改圖斑形狀、屬性,或者刪除、添加圖斑。測試

    如今須要對比兩份矢量,計算預判做業員的錯誤率、遺漏率,主體代碼很簡單,就是遍歷審覈後的矢量(審覈矢量),找出每一個圖斑對應的預判矢量圖斑,比較。若是找不到對應的圖斑,則認爲是遺漏。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

相關文章
相關標籤/搜索