Ecco la situazione:
Ho una lista che memorizza le stringhe che sono in realtà numeri e possono diventare piuttosto grandi (centinaia di milioni di elementi).
Memorizzo i numeri come stringa perché esiste un'opzione per visualizzare alcune informazioni aggiuntive che sono testo.Il modo (quasi) migliore per gestire un elenco con elementi in movimento
Poiché ciò richiede molta memoria per l'archiviazione, ho deciso di archiviare solo un massimo di 5 milioni di elementi. (questo richiederà solo circa 250-300 mb).
L'elenco viene riempito dall'output di un calcolo. Se viene trovato un numero verrà aggiunto alla lista, questo numero è sempre più grande degli articoli esistenti.
Quando l'elenco ha raggiunto 5 mil, desidero rimuovere il primo elemento e aggiungere il nuovo elemento all'elenco.
piace:
// Why is this so freaking slow???
if (_result.Count == 5000000)
_result.RemoveAt(0);
_result.Add(result);
Come si può leggere nel commento, questo è molto, molto, molto lento. Ha ridotto la mia prestazione di 15 volte. Dove ci sono voluti 2 minuti ora ci vogliono circa 30.
Ho provato alcune cose con linq come .Skip(1).ToList
ma questo ricreerà la lista ed è quindi ancora più lento.
L'elenco deve rimanere nel giusto ordine, quindi la sovrascrittura per indice non è un'opzione (a meno che non si possa spiegare un buon lavoro in giro).
La mia domanda:
C'è qualche modo decente per farlo?
Ho davvero bisogno delle prestazioni qui poiché potrebbe essere necessario controllare circa 10000000000 numeri. Questo può prendere un giorno naturalmente, ma un mese è un po 'troppo :(
bisogno di ulteriori informazioni, non esitate a chiedere, sarò felice di fornire
Soluzione:..
Questo esegue O (1)
// Set the _result
Queue<object> _result = new Queue<object>(5000000);
/// Inside the method
// If the count has reach it's max, dequeue the first item
if (_result.Count == 5000000)
_result.Dequeue();
_result.Enqueue(result);
Esiste un motivo valido per utilizzare un elenco? È possibile utilizzare un database SQLite invece – swiftgp
@ user1556110 L'applicazione deve essere in grado di essere eseguita su qualsiasi computer e in memoria, non so se sia possibile in SQLite. – Mixxiphoid
@downvoter: cura di spiegare? – Mixxiphoid