大量数据处理的一个思路

    对于在运行过程当中只用到一次,可是会严重影响运行效率的数据,在使用事后马上删除,以提升运行效率。数组

    遥感影像信息提取中,有预判、审核两步。对于同一块地区,预判做业员先勾画出目标地物并赋值,完成以后复制一份矢量交给审核做业员检查,审核做业员在预判的基础上修改图斑形状、属性,或者删除、添加图斑。测试

    如今须要对比两份矢量,计算预判做业员的错误率、遗漏率,主体代码很简单,就是遍历审核后的矢量(审核矢量),找出每一个图斑对应的预判矢量图斑,比较。若是找不到对应的图斑,则认为是遗漏。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

相关文章
相关标签/搜索