2015-08-04 25 views
8

Mam wymóg przechowywania od 2 do 15 milionów kont (które są String o długości 15) w strukturze danych dla celów wyszukiwania i sprawdzania unikalności. Początkowo planowałem przechowywać je w postaci HashSet, ale wątpię, aby szybkość wyszukiwania była wolna z powodu kolizji i ostatecznie będzie wolniejsza niż mapa drzewa (przy użyciu wyszukiwania binarnego).Czy powinienem użyć `HashSet` lub` TreeSet` dla bardzo dużego zestawu danych?

Nie ma wymogu sortowania danych. Używam Java 7. Mam system 64G z 48G dedykowany dla tej aplikacji.

To pytanie nie jest duplikatem HashSet and TreeSet performance test dlatego, że pytanie jest o wykonywaniu dodawanie elementów do Set i to pytanie jest o wydajności sprawdzenia istniejącego Set dla zduplikowanych wartości.

+1

również odsyłają [to] (http://stackoverflow.com/questions/1463284/hashset-vs-treeset) –

+0

Cześć Ankuar, dzięki. Test wydajności w łączu oparty jest na liczbach całkowitych 500K w już posortowanej kolejności. Mam 10 milionów napisów i chciałem zrozumieć możliwość kolizji hash.W drugim linku znajduje się podpowiedź, która była hwlpful. Spróbuję i opublikuję moje spostrzeżenia. – Mohan

+0

Wyszukiwanie polega na sprawdzeniu, czy określony ciąg jest obecny w zestawie ciągów. Jest to samodzielny program java i nie może sobie pozwolić na użycie czegoś takiego jak Redis do przechowywania danych. – Mohan

Odpowiedz

2

Kiedy staraliśmy się zapisać 50 milionów płyt w HashMap z odpowiednich parametrów inicjalizacji, wprowadzenie zaczął spowolnienie, szczególnie po 35 milionów płyt. Zmiana na TreeMap dała stałą wydajność wstawiania i pobierania.

Obserwacja: TreeMap zapewni lepszą wydajność niż HashMap dla dużego zestawu danych wejściowych. Dla mniejszego zestawu oczywiście HashMap zapewni lepszą wydajność.

+0

Nie pytałeś o 50 milionów rekordów, pytałeś o 15 milionów rekordów. W pewnym momencie musisz pomyśleć o swojej funkcji mieszania i prawdopodobieństwie kolizji, jeśli klucz jest po prostu "Stringiem", domyślna implementacja jest dobra dla większości celów, ale może nie być dobra dla 50 milionów łańcuchów. – durron597

12

Jeśli masz 48 GB dedykowanej pamięci dla swoich 2 mln do 15 milionów płyt, najlepiej jest prawdopodobnie użyć HashMap<Key, Record>, gdzie klucz jest Integer lub String w zależności od wymagań.

Będziesz w porządku, jeśli dojdzie do kolizji mieszacza, o ile zapewnisz wystarczającą ilość pamięci dla Map i uzyskasz odpowiedni współczynnik obciążenia.

Zalecam użycie następującego konstruktora: new HashMap<>(13_000_000); (30% więcej niż oczekiwana liczba rekordów - które zostanie automatycznie rozszerzone o do implementacji na komórki 2^24). Poinformuj swoją aplikację, że ta Map będzie bardzo duża od samego początku, więc nie będzie automatycznie rosnąć w miarę zapełniania.

HashMap wykorzystuje czas O(1) dostępu dla jego członków, natomiast TreeMap wykorzystuje O(log n) czas odnośnika, ale może być bardziej efektywne z pamięci i nie potrzebuje mądrego funkcję mieszającą. Jeśli jednak używasz kluczy String lub Integer, nie musisz martwić się o zaprojektowanie funkcji mieszania, a stałe sprawdzanie czasu będzie ogromną poprawą. Kolejną zaletą TreeMap/TreeSet jest posortowane uporządkowanie, o którym mówisz, że Cię to nie obchodzi; użyj HashMap.

Jeśli jedynym celem jest sprawdzenie listy unikalnych numerów kont, to wszystko, co powiedziałem powyżej, jest nadal prawdziwe, ale jak stwierdził w swoim pytaniu, należy użyć HashSet<String>, a nie HashMap. Zalecenia dotyczące wydajności i argument konstruktora nadal mają zastosowanie.

Dalsze czytanie: HashSet and TreeSet performance test

+0

Dziękuję bardzo. W przypadku dynamicznie rosnącego zestawu danych, w którym nie znam dokładnej liczby elementów, mogę wiedzieć, co byłoby lepsze. Zbiór danych może zawierać 2 miliony do 15 milionów (Dokładny rozmiar nieznany) – Mohan

+0

@Mohan Nie ma różnicy, jeśli masz tak dużo dostępnej pamięci. Jeśli twoja górna granica jest tak niska w porównaniu do twojej ilości pamięci, po prostu stwórz największy sensowny "HashMap" - 2^24 bity - i wszystko będzie w porządku. – durron597

Powiązane problemy