J'ai un fichier csv analyseur qui lit dans+ de 15 millions de lignes (avec de nombreux doublons), et une fois analysée dans les structures, doivent être ajoutés à la collection. Chaque structure a des propriétés de Clé (int), Un(datetime), et B(int) (et d'autres qui ne sont pas pertinentes ici).
Exigence: La collecte des besoins pour renforcer l'unicité par une Clé.
Condition B: Dans une étape ultérieure, j'ai besoin de la collection triés par les propriétés d'Un(timestamp) alors B(int).
Contrainte: Les structures éventuellement besoin d'être parcourus dans l'ordre, un par un, avec des références à des voisins (une LinkedList présente la solution la plus propre ici); le but de cette opération est de partitionner l'ensemble. Veuillez supposer que c'est le plus ancien que le partitionnement peut se produire (c'est à dire, il ne peut pas être partitionné à l'analyse de la scène).
J'ai trouvé que la SortedSet fonctionne très bien pour un besoin d'Un, et c'est assez performant ainsi, même si l'O(log n) insertions sont beaucoup plus lentement qu'avec HashSet<T>
s'O(1), bien que je ne se soucient pas de tri sur la touche. HashSet<T>
s'enlise lors de la collecte obtient un énorme, qui, apparemment, est un problème connu, tandis que l' SortedSet<T>
ne souffre pas de cet inconvénient.
Le problème: Quand j'arrive à l'étape de l'Exigence B, le tri de la collection ( SortedSet<T>
passés à une méthode qu' IEnumerable<T>
) prend un montant prohibitif de temps (+de 20 minutes de broyage, tous en mémoire, pas d'utilisation de fichier de page).
La question: quel(s) est(sont) le mieux adapté pour résoudre ce problème? Une idée est d'utiliser deux collections: l'une pour renforcer l'unicité (comme un HashSet<int>
ou SortedSet<int>
de clés), et un second SortedSet<T>
pour gérer le tri à l'analyse de la scène (c'est à dire, le plus en amont possible). Mais l'application est déjà beaucoup de mémoire, et de l'exécution des peines d'avoir besoin du fichier d'échange est prohibitif.
Quelles sont les options qui me laissent pour une collection unique qui assure l'unicité par une caractéristique, mais trie par d'autres sans rapport avec les caractéristiques? SortedSet<T>
utilise IComparer<T>
(mais pas les deux IComparer<T>
et IEquitable<T>
), de sorte que si elle s'appuie sur CompareTo pour renforcer l'unicité, alors il ne semble pas pour l'adapter à mes besoins. Est-classement SortedSet le chemin à parcourir?
Edit: Le code de tri:
SortedSet<Dto> parsedSet = {stuff};
var sortedLinkedStructs = new LinkedList<Dto>(parsedSet.OrderBy(t => t.Timestamp).ThenBy(i => i.SomeInt));
La structure:
public readonly struct Dto: IEquatable<Dto>, IComparer<Dto>, IComparable<Dto>
{
public readonly datetime Timestamp;
public readonly int SomeInt;
public readonly int Key;
ctor(ts, int, key){assigned}
public bool Equals(Dtoother) => this.Key == other.Key;
public override int GetHashCode() => this.Key.GetHashCode();
public int Compare(Dto x, Dto y) => x.Key.CompareTo(y.Key);
public int CompareTo(Dto other) => this.Key.CompareTo(other.Key);
}