Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在scala中最有效地合并和聚合2个贴图?_Scala_Parallel Processing_Parallel Collections - Fatal编程技术网

如何在scala中最有效地合并和聚合2个贴图?

如何在scala中最有效地合并和聚合2个贴图?,scala,parallel-processing,parallel-collections,Scala,Parallel Processing,Parallel Collections,我有以下两张地图: 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",

我有以下两张地图:

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))
但我注意到折叠式的速度比聚合式的快得多


我想知道如何使这个操作效率最高。

< P>如果你想用PAR运行一个更有效的集合,尝试用向量代替数组,它是并行算法的最佳集合之一。 另一方面,并行工作有一些开销,因此如果数据不足,将不方便

用您提供的数据,向量集聚合优于数组Aray.PAR.聚合,但向量集比FodLead更好,

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

您的数组有2个元素,因此当您创建
.par
数组时,您认为Scala将为
.aggregate
创建多少块?我相信答案是1。你是对的,这种编码方法不适合我的问题。在我的代码中,我有两个映射,我正在使用foldLeft对它们进行聚合和合并。地图将包含大量数据(数千行)。性能是一个问题。因此,我正在试图找出更好的方法。是否需要不可变的
Map
s?在我的机器上,将一个可变的
映射
合并到另一个映射比
foldLeft
快约5倍(取决于需要复制的键数)。我想如果我将foldLeft转换为折叠,可能可以获得并行性。第一次使用时间:2085636第二次使用时间:4611369第三次使用时间:3220944。这些是我机器上的计时。在大多数测试运行中,foldLeft是最有效的,我得到的结果是一致的。我可以复制您的结果模式,可能是每10次运行一次。可能您的集合太小,导致并行执行的开销大于好处?只是猜测而已。