Tengo una aplicación C# que almacena datos de un archivo de texto en un objeto de diccionario. La cantidad de datos que se almacenan puede ser bastante grande, por lo que lleva mucho tiempo insertar las entradas. Con muchos elementos en el Diccionario, empeora aún más, debido al cambio de tamaño de la matriz interna, que almacena los datos para el Diccionario. Así que inicié el diccionario con la cantidad de elementos que se agregarán, pero esto no tiene ningún impacto en la velocidad.High Runtime for Dictionary.Add para una gran cantidad de elementos
Aquí es mi función:
private Dictionary<IdPair, Edge> AddEdgesToExistingNodes(HashSet<NodeConnection> connections)
{
Dictionary<IdPair, Edge> resultSet = new Dictionary<IdPair, Edge>(connections.Count);
foreach (NodeConnection con in connections)
{
...
resultSet.Add(nodeIdPair, newEdge);
}
return resultSet;
}
En mis pruebas, inserto ~ 300k artículos. Comprobé el tiempo de ejecución con ANTS Performance Profiler y encontré que el tiempo promedio para resultSet.Add (...) no cambia cuando inicializo el diccionario con el tamaño necesario. Es lo mismo que cuando inicializo el Diccionario con el nuevo Diccionario(); (aproximadamente 0.256 ms en promedio para cada Add). Esto es definitivamente causado por la cantidad de datos en el Diccionario (AUNQUE lo inicialicé con el tamaño deseado). Para los primeros 20k artículos, el tiempo promedio para Add es de 0.03 ms para cada artículo.
¿Alguna idea de cómo hacer que la operación adicional sea más rápida?
Gracias de antemano, Frank
Aquí está mi IdPair-Struct:
public struct IdPair
{
public int id1;
public int id2;
public IdPair(int oneId, int anotherId)
{
if (oneId > anotherId)
{
id1 = anotherId;
id2 = oneId;
}
else if (anotherId > oneId)
{
id1 = oneId;
id2 = anotherId;
}
else
throw new ArgumentException("The two Ids of the IdPair can't have the same value.");
}
}
¿Está sobreescribiendo 'Equals' y' GetHashCode' en su clase 'IdPair'? Si es así, ¿su algoritmo 'GetHashCode' produce una distribución de hash decente? – LukeH
IdPair es solo una estructura con un constructor. Lo agregué a mi pregunta – Aaginor