Stosując Scala i iskry, że ma następującą budowę:W jaki sposób kompilator Scala obsługuje nieużywane wartości zmiennych?
val rdd1: RDD[String] = ...
val rdd2: RDD[(String, Any)] = ...
val rdd1pairs = rdd1.map(s => (s, s))
val result = rdd2.join(rdd1pairs)
.map { case (_: String, (e: Any, _)) => e }
Celem odwzorowania rdd1
w PairRDD
jest przyłączyć rdd2
w następnym etapie. Jednak w rzeczywistości interesują mnie tylko wartości rdd2
, stąd krok mapowania w ostatniej linii, która pomija klawisze. W rzeczywistości jest to skrzyżowanie między rdd2
i rdd1
wykonane z Spark's join()
ze względów wydajnościowych.
Moje pytanie dotyczy klawiszy rdd1pairs
: są one tworzone wyłącznie z powodów składniowych (w celu umożliwienia łączenia) w pierwszym kroku mapy, a następnie są odrzucane bez żadnego użycia. Jak radzi sobie z tym kompilator? Czy ma znaczenie pod względem zużycia pamięci, czy używam Stringa s
(jak pokazano w przykładzie)? Czy powinienem go zastąpić przez null
lub 0
, aby zaoszczędzić trochę pamięci? Czy kompilator faktycznie tworzy i przechowuje te obiekty (odniesienia), czy zauważa, że nigdy nie są używane?
Brzmi rozsądnie, dzięki. Jednak nadal nie jestem pewien, jak przechowywanie odniesień do jednostki oszczędza znaczną ilość pamięci w porównaniu do oryginalnego wariantu ciągów. Czy to? – Carsten
Mam rozszerzoną odpowiedź na ten temat – mattinbits
Ale w pierwotnym pytaniu nie są tworzone żadne nowe ciągi. Odniesienie do ciągu jest takie samo jak odwołanie do '()'. –