zoukankan      html  css  js  c++  java
  • 大量数据处理的一个思路

        对于在运行过程中只用到一次,但是会严重影响运行效率的数据,在使用过后立刻删除,以提高运行效率。

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

        现在需要对比两份矢量,计算预判作业员的错误率、遗漏率,主体代码很简单,就是遍历审核后的矢量(审核矢量),找出每个图斑对应的预判矢量图斑,比较。如果找不到对应的图斑,则认为是遗漏。

                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万左右的矢量,一夜都没比较完。经过排查,时间开销最大的是空间查找对应图斑这段代码。因此我试着在图形比较之前添加以下代码,删除与审核图斑属性形状都相同的预判图斑。

                    if (relOp.Equals(preFeat.Shape) && preAttr.Equals(chkAttr))
                    {
                        preFeat.Delete();
                        continue;
                    }

    结果原先一夜跑不完的数据只用了半小时就搞定。

        这里就是我想要说的思路,对于在运行过程中只用到一次,但是会严重影响运行效率的数据,在使用过后立刻删除,以提高运行效率。

        想到这个思路后两天,又遇到了一个数据量很大的需求。有一份矢量,要求其中一个字段里的值不能有重复,但是检查之后发现有1万多图斑的值有重复,需要找出这1万多图斑。我的实现代码如下:

    # 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()所需的时间逐次减少,以提高效率。

        用一份40万个图斑的矢量测试,以上代码需要16分钟,把倒数第二行注释之后再测试,需要30分钟,消耗的时间增加了几乎一倍。

        最近遇到的业务量越来越大,如果有其他好的提高效率的方法,希望大家多指点。

  • 相关阅读:
    Url参数的安全性处理
    redis安装学习
    Spring的IOC原理(转载)
    Linux下jdk&tomcat的安装
    App架构经验总结(转载)
    谈谈对Spring IOC的理解(转载)
    2018,扬帆起航!
    Lua随机问题
    为什么R#警告Warning Delegate subtraction has unpredictable result
    Dotween实现打字机效果,并向下滚屏
  • 原文地址:https://www.cnblogs.com/sunnyeveryday/p/6641757.html
Copyright © 2011-2022 走看看