válido uso una tipo sumar seleccionar recorrer obtener función filas fila ejemplos datos compute columnas columna agregado c# .net optimization datatable

uso - sumar columna datatable c#



¿Velocidad de las búsquedas de filas/columnas de DataSet? (4)

Recientemente tuve que hacer algo de procesamiento de cosas pesadas con datos almacenados en un DataSet. Fue lo suficientemente pesado que terminé usando una herramienta para ayudar a identificar algunos cuellos de botella en mi código. Cuando estaba analizando los cuellos de botella, noté que aunque las búsquedas de DataSet no eran terriblemente lentas (no eran el cuello de botella), era más lento de lo que esperaba. Siempre asumí que DataSets utilizaba algún tipo de implementación de estilo HashTable que haría búsquedas O (1) (o al menos eso es lo que creo que son HashTables). La velocidad de mis búsquedas parecía ser significativamente más lenta que esta.

Me preguntaba si alguien que sabe algo sobre la implementación de la clase DataSet de .NET se preocuparía por compartir lo que saben.

Si hago algo como esto:

DataTable dt = new DataTable(); if(dt.Columns.Contains("SomeColumn")) { object o = dt.Rows[0]["SomeColumn"]; }

¿Qué tan rápido sería el tiempo de búsqueda para el método Contains(...) y para recuperar el valor para almacenar en el Object o ? Pensé que sería muy rápido, como HashTable (suponiendo que lo que entiendo de HashTables es correcto) pero no parece que ...

Escribí ese código de memoria así que algunas cosas pueden no ser "sintácticamente correctas".


De hecho, es recomendable usar un número entero al hacer referencia a la columna, que puede mejorar mucho en términos de rendimiento. Para mantener las cosas manejables, puede declarar entero constante. Entonces, en lugar de lo que hiciste, podrías hacer

const int SomeTable_SomeColumn = 0; DataTable dt = new DataTable(); if(dt.Columns.Contains(SomeTable_SomeColumn)) { object o = dt.Rows[0][SomeTable_SomeColumn]; }


En realidad, creo que los nombres de las columnas se almacenan en una Hashtable. Debe ser O (1) o búsqueda constante para búsquedas sensibles a mayúsculas y minúsculas. Si tuviera que mirar a través de cada uno, entonces por supuesto sería O (n).


Imagino que cualquier búsqueda sería O (n), ya que no creo que usen cualquier tipo de hashtable, pero en realidad usaría más de una matriz para encontrar filas y columnas.


A través de Reflector, los pasos para DataRow ["ColumnName"] son:

  1. Obtenga la DataColumn de ColumnName. Utiliza la DataColumnCollection de la fila ["ColumnName"]. Internamente, DataColumnCollection almacena sus DataColumns en una Hastable. O (1)
  2. Obtenga el índice de fila de DataRow. El índice se almacena en un miembro interno. O (1)
  3. Obtenga el valor de DataColumn en el índice usando DataColumn [index]. DataColumn almacena sus datos en un miembro System.Data.Common.DataStorage (interno, abstracto):

    return dataColumnInstance._storage.Get (recordIndex);

    Una implementación concreta de muestra es System.Data.Common.StringStorage (interna, sellada). StringStorage (y los otros DataStoresage concretos que verifiqué) almacenan sus valores en una matriz. Get (recordIndex) simplemente toma el objeto en la matriz de valores en el recordIndex. O (1)

Entonces, en general, eres O (1) pero eso no significa que la función de hash y llamada de función durante la operación sea sin costo. Simplemente significa que no cuesta más a medida que aumenta la cantidad de DataRows o DataColumns.

Es interesante que DataStorage use una matriz de valores. No puedo imaginar que sea fácil de reconstruir cuando agrega o quita filas.