Oto sytuacja:
Mam listę ciągów sklepu, które w rzeczywistości są liczbami i mogą stać się całkiem spore (setki milionów pozycji).
Przechowuję liczby jako ciąg znaków, ponieważ istnieje opcja wyświetlania dodatkowych informacji, którymi są tekst.(prawie) najlepszy sposób zarządzania listą z przesunięciem elementów
Ponieważ zajmuje to dużo pamięci, zdecydowałem, że będę przechowywać maksymalnie 5 milionów sztuk. (zajmie to tylko około 250-300mb).
Lista jest wypełniona wynikiem obliczeń. Jeśli liczba zostanie znaleziona, zostanie dodana do listy, ta liczba jest zawsze większa niż istniejące elementy.
Gdy lista osiągnie 5 mil, chcę usunąć pierwszy element i dodać nowy element do listy.
lubię:
// Why is this so freaking slow???
if (_result.Count == 5000000)
_result.RemoveAt(0);
_result.Add(result);
Jak można przeczytać w komentarzu, to jest bardzo, bardzo, bardzo powoli. Po prostu zmniejszyłem moją wydajność 15 razy. Gdzie zajęło to 2 minuty zajmuje teraz około 30.
Próbowałem kilku rzeczy z linq jak .Skip(1).ToList
, ale to odtworzy listę i dlatego jest jeszcze wolniejsze.
Lista musi pozostać we właściwej kolejności, więc nadpisanie według indeksu nie jest opcją (chyba że można wytłumaczyć miłą pracę).
Moje pytanie:
Czy jest jakiś przyzwoity sposób na zrobienie tego?
Naprawdę potrzebuję wydajności tutaj, ponieważ może zajść potrzeba sprawdzenia około 10000000000 numerów. Może to potrwać dzień oczywiście, ale miesiąc jest nieco zbyt dużo :(
potrzebują dodatkowych informacji, nie krępuj się zapytać, będę szczęśliwy dostarczyć
. Rozwiązanie:.
ten wykonuje 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);
Czy istnieje ważny powód, że musisz użyć listy? Czy można użyć bazy danych SQLite zamiast: – swiftgp
@ user1556110 Aplikacja musi być w stanie uruchomić na dowolnym komputerze i w pamięci, nie wiem, czy jest to możliwe w SQLite. – Mixxiphoid
@downvoter: czy chcesz wyjaśnić? – Mixxiphoid