5 votos

Desempeño bajo cuando se selección de características

Estoy tratando de utilizar el código siguiente para seleccionar las características que tienen los valores de atributo que me pase. El rendimiento es muy lento cuando se trata de una gran cantidad de valores de e.g >16k valores para que coincidan con las características.

Hay algo que me falta o una mejor manera de hacer esto?

// Suponiendo valores.Ninguna() es true:

var featureSelection = (layer as IFeatureSelection);

var whereClause = new StringBuilder();
var count = 0;
while (true)
{
    var values = valuesToSelect.Skip(count*1000).Take(1000).ToList();
    if (!values.Any()) break;
    var thousandsClause = new StringBuilder();
    foreach (var value in values)
    {
        thousandsClause.Append(",");
        thousandsClause.Append(value);
    }
    thousandsClause.Remove(0, 1);
    thousandsClause.Insert(0, fieldName + " IN (");
    thousandsClause.Append(")");
    whereClause.Append(" OR " + thousandsClause);

    count++;
}
whereClause.Remove(0, 4);
IQueryFilter queryFilter = new QueryFilter();
queryFilter.WhereClause = whereClause.ToString();

featureSelection.SelectFeatures(queryFilter, esriSelectionResultEnum.esriSelectionResultNew, false);
featureSelection.SelectionChanged();

La muestra en la que EN las cláusulas:

761 valores para seleccionar

122,072 valores para seleccionar

Editar--

Hasta ahora con las recomendaciones de algunos de los comentarios, he mejorado el código y los resultados son más rápidos pero todavía no es deseable. Aquí está el código que he comenzado a tratar el uso de la misma en la que EN la cláusula:

IQueryFilter queryFilter = new QueryFilter();
queryFilter.WhereClause = whereClause.ToString();
queryFilter.SubFields = "OBJECTID";

var featureLayer = layer as IFeatureLayer2;
if (featureLayer == null) continue;

IFeatureClass featureClass = featureLayer.FeatureClass;
var dataset = (IDataset) featureClass;
IWorkspace workSpace = dataset.Workspace;
ISelectionSet selectionSet = featureClass
.Select(queryFilter, esriSelectionType.esriSelectionTypeHybrid,esriSelectionOption.esriSelectionOptionNormal,workSpace);

var featureSelection = layer as IFeatureSelection;
if (featureSelection != null)
{
    featureSelection.SelectionSet = selectionSet;
    featureSelection.SelectionChanged();
}

1voto

Flinkman Puntos 4821

Veo que usted está construyendo un enorme donde cláusula que está causando el SQL obtener irascible. Trato de seleccionar en cada caso y luego añadir a la selección de cada nuevo caso:

    ISelectionSet FinalSet = FeatureClass.Select(
    null,
    esriSelectionType.esriSelectionTypeHybrid,
    esriSelectionOption.esriSelectionOptionEmpty,
    workSpace);

ISelectionSet Recycle;
IQueryFilter pQF = new QueryFilterClass();
while (true) 
{ // include here getting the value for each selection

    pQF.WhereClause = fieldName + " = " + value;
    Recycle = FeatureClass.Select(
        pQF,
        esriSelectionType.esriSelectionTypeHybrid,
        esriSelectionOption.esriSelectionOptionNormal,
        workSpace);
    FinalSet.Combine(Recycle,esriSetOperation.esriSetUnion,FinalSet);
}

Esto hacer múltiples selecciones pequeñas y acumularlas en el FinalSet entonces usted puede hacer su featureslection de la FinalSet.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X