/ / Scala HashSet czy HashMap, aby zaimplementować pamięć podręczną ciągów? - Scala, buforowanie, hashset

Scala HashSet lub HashMap do implementacji pamięci podręcznej ciągów? - scala, caching, hashset

W moim bieżącym kodzie widzę wiele buforowanych identyfikatorów, takich jak:

val idMapping = MMap.empty[String, String]
idMapping.put("ID1234", "ID1234")

Jest to rzekomo zrobione jako skuteczny sposób buforowania tych unikalnych identyfikatorów w celu szybkiego wyszukiwania, takich jak -

idMapping.get("ID1234")

a jeśli zwróci zero, bla bla.

Czy jest na to lepsza alternatywa? Z łatwością przychodzi mi na myśl HashSet, ale w Scali znalazłem niewiele przykładów pamięci podręcznej opartych na HashSet?

Czy ktoś może zaproponować ulepszenia powyższego projektu?

Odpowiedzi:

1 dla odpowiedzi № 1

Użyć Set. Jeśli to naprawdę zawsze jest mapowanie tożsamości, a Map jest całkowicie niepotrzebne. Zużywa więcej pamięci i może być wolniejszy, gdy używasz get, z powodu stworzenia Option wartość. Sprawdzam również if (alreadyProcessed(key)) po prostu wygląda ładniej niż if (alreadyProcessed.get(key).nonEmpty).


1 dla odpowiedzi nr 2

Najlepszą strukturą danych do buforowania jest WeakHashMap.

W twoim przykładzie:

val cache = new WeakHashMap[String, String]

/* … */

val value = cache.getOrElseUpdate(id, generate(id))

WeakHashMap nie chroni kluczy przedwyrzucanie elementów bezużytecznych, co oznacza, że ​​wpisy zostaną automatycznie usunięte, gdy nie będą już używane i nastąpi pewne wyrzucanie elementów bezużytecznych. mutable.HashMap można zamiast tego użyć (getOrElseUpdate jest również dostępna), jeśli pamięć nie stanowi problemu.