Как наиболее эффективно объединить и объединить 2 Карты в Scala? - PullRequest
0 голосов
/ 31 августа 2018

У меня есть следующие 2 карты:

val map12:Map[(String,String),Double]=Map(("Sam","0203") -> 16216.0, ("Jam","0157") -> 50756.0, ("Pam","0129") -> 3052.0)
val map22:Map[(String,String),Double]=Map(("Jam","0157") -> 16145.0, ("Pam","0129") -> 15258.0, ("Sam","0203") -> -1638.0, ("Dam","0088") -> -8440.0,("Ham","0104") -> 4130.0,("Hari","0268") -> -108.0, ("Om","0169") -> 5486.0, ("Shiv","0181") -> 275.0, ("Brahma","0148") -> 18739.0)

В первом подходе я использую foldLeft для достижения слияния и накопления:

val t1 = System.nanoTime()
val merged1 = (map12 foldLeft map22)((map22, map12) => map22 + (map12._1 -> (map12._2 + map22.getOrElse(map12._1, 0.0))))
val t2 = System.nanoTime()
println(" First Time taken :"+ (t2-t1))

Во втором подходе я пытаюсь использовать функцию aggregate (), которая поддерживает параллельную работу:

def merge(map12:Map[(String,String),Double], map22:Map[(String,String),Double]):Map[(String,String),Double]=
  map12 ++ map22.map{case(k, v) => k -> (v + (map12.getOrElse(k, 0.0)))}

val inArr= Array(map12,map22)

val t5 = System.nanoTime()
val mergedNew12 = inArr.par.aggregate(Map[(String,String),Double]())(merge,merge)
val t6 = System.nanoTime()
println(" Second Time taken :"+ (t6-t5))

Но я заметил, что foldLeft намного быстрее, чем совокупность.

Я ищу совет о том, как сделать эту операцию наиболее эффективной.

1 Ответ

0 голосов
/ 31 августа 2018

Если вы хотите, чтобы агрегат был более эффективным при работе с par, попробуйте Vector вместо Array, это одна из лучших коллекций для параллельных алгоритмов.

С другой стороны, параллельная работа имеет некоторые накладные расходы, поэтому, если у вас недостаточно данных, это будет не удобно.

С данными, которые вы нам предоставили, Vector.par.aggregate лучше, чем Array.par.aggregate, но Vector.aggregate лучше, чем foldLeft.

val inVector= Vector(map12,map22)

val t7 = System.nanoTime()
val mergedNew12_2 = inVector.aggregate(Map[(String,String),Double]())(merge,merge)
val t8 = System.nanoTime()
println(" Third Time taken :"+ (t8-t7))

Это мои времена

First Time taken :6431723
Second Time taken:147474028
Third Time taken :4855489
...