Tengo un proceso heredado que estoy convirtiendo a C# de otro idioma. Numerosos pasos en el ciclo de proceso a través de lo que puede ser una gran cantidad de registros (100K-200K) para hacer cálculos. Como parte de esos procesos, generalmente hace una búsqueda en otra lista para recuperar algunos valores. Normalmente movería este tipo de cosas a una declaración de SQL (y tenemos donde hemos podido), pero en estos casos no hay una manera fácil de hacerlo. En algunos lugares, intentamos convertir el código a un procedimiento almacenado y decidimos que no funcionaba tan bien como esperábamos.¿Cuál es la forma más rápida de buscar una lista <T> en varias propiedades?
Efectivamente, el código hace esto:
var match = cost.Where(r => r.ryp.StartsWith(record.form.TrimEnd()) &&
r.year == record.year &&
r.period == record.period).FirstOrDefault();
costo es un tipo de lista local. Si estuviera haciendo una búsqueda en un solo campo, probablemente solo movería esto a un diccionario. Los registros tampoco son siempre únicos.
Obviamente, esto es REALMENTE lento.
me encontré con la biblioteca de código abierto I4O que se puede construir índices, sin embargo, no para mí en varias consultas (y yo realmente no tienen el tiempo para intentar depurar el código fuente). Tampoco funciona con .StartsWith o .Contains (StartsWith es mucho más importante ya que muchas de las consultas originales aprovechan el hecho de que al buscar "A" encontraría una coincidencia en "ABC").
¿Hay algún otro proyecto (de código abierto o comercial) que haga este tipo de cosas?
EDIT:
lo hice un poco de búsqueda en base a la retroalimentación y encontró Power Collections que apoya a los diccionarios que tienen claves que no son únicos.
Probé ToLookup() que funcionó muy bien, todavía no es tan rápido como el código original, pero al menos es aceptable. Ha bajado de 45 segundos a 3-4 segundos. Echaré un vistazo a la estructura de Trie para las otras búsquedas.
Gracias.
¿El ciclo de proceso realiza muchas búsquedas en el mismo conjunto de registros, o el conjunto de registros se usa solo unas pocas veces antes de necesitar uno nuevo? – Telastyn
Hace un ciclo en el mismo conjunto de registros. Entonces la misma búsqueda se usa todo el tiempo. Un paso del proceso que toma 1-2 segundos en el código anterior toma 35 segundos en el nuevo código. –
Otra cosa a considerar podría ser trazar el problema a diferentes hilos (a través de 'Parallel.ForEach') dependiendo de si no es crítico para iterar en un orden determinado, junto con la indexación de la búsqueda. –