2013-07-30 10 views
5

Mam hashmap, który przechowuje około 1 G danych to warunki par klucz-wartość. Ta mieszanka zmienia się co 15 dni. Zostanie załadowany do pamięci i użyty stamtąd.Zamień dużą hashmap w AS

Gdy do pamięci musi zostać wczytana nowa łata, w pamięci było już kilka transakcji mających dostęp do mapy mieszającej. Jak mogę zamienić starhmapę na nową bez wpływu na bieżące transakcje uzyskujące dostęp do starej hashmapy. Czy istnieje sposób na gorący wymień hashmap w pamięci?

+0

Jeśli twój problem został rozwiązany, powinieneś [zaakceptować odpowiedź.] (Http://meta.stackexchange.com/q/5234/133242) –

Odpowiedz

3

Zamiast używać bezpośredniego (twardego) odniesienia do mapy, używaj wartości AtomicReference<Map<Foo, Bar>>. Konsumenci mapy będą używać #get(), a kiedy będziesz gotowy do zamiany mapy, Twój "wewnętrzny" kod będzie używał #set() lub #getAndSet().

+0

Albo po prostu oznaczyć mapę tak, aby użytkownicy nie mieli zmienić ich kod. – assylias

+0

Czy ConcurrentHashMap rozwiąże mój problem? – Abhi

+0

Nie, ponieważ powiedziałeś, że chcesz "przesłać" hashmap bez dokonywania transakcji curring, uzyskując dostęp do starej hashmapy. –

0

Proponuję użyć narzędzi do buforowania, takich jak memcached, jeśli rozmiar danych jest duży jak twój. W ten sposób możesz unieważnić poszczególne elementy lub całą pamięć podręczną zgodnie z wymaganiami.

+0

Jest to ortogonalne w stosunku do pytania OP. –

+0

Musimy przejść przez rozwiązanie w pamięci, ponieważ mapa jest czymś, co otrzymujemy jako serializowany obiekt java z innego rozwiązania – Abhi

1
  1. Podaj getter na mapie
  2. Mark mapa prywatne i lotny
  3. Podczas aktualizacji mapy, tworzyć nowe, wypełnić go, a kiedy jest gotowy, należy przypisać go do prywatnej zmiennej mapy.

Przypisania referencyjne są atomiczne w Javie, a lotność zapewnia widoczność.

Ostrzeżenia:

  • będziesz mieć dwie mapy w pamięci na pewnym etapie
  • jeśli jakiś kod utrzymuje odniesienie do starej mapie będzie dostęp nieaktualne dane. Jeśli to jest problem, możesz całkowicie ukryć mapę i podać numer get(K key), aby użytkownicy zawsze mieli dostęp do najnowszej mapy.
+0

Czy ConcurrentHashMap rozwiąże mój problem bez konieczności oznaczania go jako niestabilnego? – Abhi