Ho una vasta raccolta di stringhe (fino a 1M) ordinate alfabeticamente. Ho sperimentato query LINQ contro questa raccolta utilizzando HashSet, SortedDictionary e Dictionary. Sto memorizzando nella cache statica la raccolta, ha una dimensione massima di 50 MB e sto sempre chiamando la query LINQ contro la raccolta memorizzata nella cache. Il mio problema è il seguente:Prestazioni LINQ per grandi collezioni
Indipendentemente dal tipo di raccolta, le prestazioni sono molto più scarse di SQL (fino a 200 ms). Quando si esegue una query simile rispetto alle tabelle SQL sottostanti, le prestazioni sono molto più veloci (5-10 ms). Ho implementato le mie query LINQ come segue:
public static string ReturnSomething(string query, int limit)
{
StringBuilder sb = new StringBuilder();
foreach (var stringitem in MyCollection.Where(
x => x.StartsWith(query) && x.Length > q.Length).Take(limit))
{
sb.Append(stringitem);
}
return sb.ToString();
}
E 'la mia comprensione che la HashSet, dizionario, ecc implementare le ricerche utilizzando la ricerca binaria albero invece che l'enumerazione standard. Quali sono le opzioni per le query LINQ ad alte prestazioni nei tipi di raccolta avanzati?
Eccellente! Alte prestazioni e esattamente quello che stavo cercando. Consiglieresti questo metodo (modificato ovviamente) per eseguire una query in proprietà su una raccolta di oggetti non stringa? –
Sì, è possibile rendere generica la classe Index e utilizzare un hashset anziché un elenco, quindi è possibile creare indici per proprietà diverse e intersecare gli hashset per restringere gli elementi da cercare. – Guffa
E le stringhe più corte di indexLength - Add() non le memorizzerà e Find() non le troverà? – Sam