scala组合函数影响GC开销

scala组合函数影响GC开销,scala,apache-spark,Scala,Apache Spark,我有以下过程,它获取字符串列表并生成其组合: val a = List(("a","a"),("a","b"),("a","c"),("b","a"),("b","b"),("b","c"),("c","a"),("c","b"),("c","c")); 我试图生成一个3个组合的列表(因为3是集合中不同字母的数量),其中左侧的每个成员只映射到右侧的一个不同成员,反之亦然 例如,我期望的输出是: List(("a","a"),("b","b"),("c","c")) List (("a","

我有以下过程,它获取字符串列表并生成其组合:

val a = List(("a","a"),("a","b"),("a","c"),("b","a"),("b","b"),("b","c"),("c","a"),("c","b"),("c","c"));
我试图生成一个3个组合的列表(因为3是集合中不同字母的数量),其中左侧的每个成员只映射到右侧的一个不同成员,反之亦然

例如,我期望的输出是:

List(("a","a"),("b","b"),("c","c")) 
List (("a","a"),("b","a"),("a","c"))
但它不可能是这样的:

List(("a","a"),("b","b"),("c","c")) 
List (("a","a"),("b","a"),("a","c"))
所以我写了以下内容:

val res = a
  .combinations(3)
  .toList
  .filter(x =>
    x.map(y => y._1).distinct.size == 3
    &&  x.map(y => y._2).distinct.size == 3 
  )
这将生成正确的答案集:

List((a,a), (b,b), (c,c))
List((a,a), (b,c), (c,b))
List((a,b), (b,a), (c,c))
List((a,b), (b,c), (c,a))
List((a,c), (b,a), (c,b))
List((a,c), (b,b), (c,a))

但是,当我随着组合的数量增加a的大小时,我就碰到了GC开销。我想知道是否有一种方法可以不使用组合函数或以更高效的方式来做我想要的事情?我使用的是Spark,所以我也可以在这上面使用任何Spark函数,尽管我认为没有。

事实上,Spark没有
组合
函数,但您可以通过连续调用
笛卡尔
来模拟它。就性能而言,它可能不太有效,但它应该可以防止您遇到的内存问题,并解决收集的需要(它有自己的性能成本):


实际上,Spark没有
组合
函数,但是您可以通过连续调用
笛卡尔
来模拟它。就性能而言,它可能不太有效,但它应该可以防止您遇到的内存问题,并解决收集的需要(它有自己的性能成本):


你知道你没有用Spark做这些吗?您正在将(本地)计算的结果传递给
sc.parallelize
,然后对创建的并行数据集(RDD)不做任何操作。。。所以Spark实际上没有在这方面做任何工作code@TzachZohar是的,我知道-事实上,我把它们收集到主机上,以便在scala中使用组合函数,因为spark不这样做。我可以使用笛卡尔坐标创建一个2的组合,但这与问题无关。如果你有办法在一个RDD上使用Spark,我很乐意接受这个答案:)如果你的输入太大,
toList
会杀死你。尝试流式组合,而不是在前面构建一个巨大的列表。如果您正在收集使用
组合
,则假定数据集不会太大,您的单个进程驱动程序无法处理;如果是这样的话,为什么要从Spark开始呢?@BrianPendleton-hmmm,没错,会尝试一下。你知道你没有用Spark做这些吗?您正在将(本地)计算的结果传递给
sc.parallelize
,然后对创建的并行数据集(RDD)不做任何操作。。。所以Spark实际上没有在这方面做任何工作code@TzachZohar是的,我知道-事实上,我把它们收集到主机上,以便在scala中使用组合函数,因为spark不这样做。我可以使用笛卡尔坐标创建一个2的组合,但这与问题无关。如果你有办法在一个RDD上使用Spark,我很乐意接受这个答案:)如果你的输入太大,
toList
会杀死你。尝试流式组合,而不是在前面构建一个巨大的列表。如果您正在收集使用
组合
,则假定数据集不会太大,您的单个进程驱动程序无法处理;如果是这样的话,为什么要从Spark开始呢?@BrianPendleton-hmmm,没错,会尝试一下。