Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.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并行化子集调用_Scala_Parallel Processing_Set - Fatal编程技术网

Scala并行化子集调用

Scala并行化子集调用,scala,parallel-processing,set,Scala,Parallel Processing,Set,我有一个列表,我想从中提取子集。我也是` val l = List(1,2,4).toSet.subsets.toList `这适用于较小的列表大小,但在较大的列表上失败。如何使子集调用并行 我尝试使列表“l”本身并行,但是对该列表的toSet调用返回一个没有子集调用的parSeq。我必须编写自己的子集算法吗 感谢您的帮助。失败的原因可能有两个: 执行时间太长 内存不足 两者都与同一个问题有关:您试图具体化一个大小呈指数增长的迭代器 def subsets():Iterator[Set[a

我有一个列表,我想从中提取子集。我也是`

val l = List(1,2,4).toSet.subsets.toList
`这适用于较小的列表大小,但在较大的列表上失败。如何使子集调用并行

我尝试使列表“l”本身并行,但是对该列表的toSet调用返回一个没有子集调用的parSeq。我必须编写自己的子集算法吗


感谢您的帮助。

失败的原因可能有两个:

  • 执行时间太长
  • 内存不足
两者都与同一个问题有关:您试图具体化一个大小呈指数增长的迭代器

def subsets():Iterator[Set[a]
返回一个迭代器而不是一个列表,这是有充分理由的——结果集可能很大。事实上 所有可能的子集都是
2^n

scala> (1 to 10).toSet.subsets.size
res0: Int = 1024

scala> math.pow(2, 10)
res1: Double = 1024.0
如果您并行生成子集,您仍然会很快耗尽内存或无休止地等待。换句话说,这是一个算法问题,而不是并发/硬件问题

实现这一点的方法是在运行时使用惰性生成器(迭代器/流),而不是试图一次获取所有数据。如果您更喜欢
Stream
接口,则可以将返回的迭代器转换为Stream:

scala> (1 to 10).toSet.subsets.toStream
res2: scala.collection.immutable.Stream[scala.collection.immutable.Set[Int]] = Stream(Set(), ?)

流只是惰性列表,因此在数据结构本身方面没有太大差异,它应该符合您的要求。

失败的原因可能有两个:

  • 执行时间太长
  • 内存不足
两者都与同一个问题有关:您试图具体化一个大小呈指数增长的迭代器

def subsets():Iterator[Set[a]
返回一个迭代器而不是一个列表,这是有充分理由的——结果集可能很大。事实上 所有可能的子集都是
2^n

scala> (1 to 10).toSet.subsets.size
res0: Int = 1024

scala> math.pow(2, 10)
res1: Double = 1024.0
如果您并行生成子集,您仍然会很快耗尽内存或无休止地等待。换句话说,这是一个算法问题,而不是并发/硬件问题

实现这一点的方法是在运行时使用惰性生成器(迭代器/流),而不是试图一次获取所有数据。如果您更喜欢
Stream
接口,则可以将返回的迭代器转换为Stream:

scala> (1 to 10).toSet.subsets.toStream
res2: scala.collection.immutable.Stream[scala.collection.immutable.Set[Int]] = Stream(Set(), ?)

流只是惰性列表,因此在数据结构本身方面没有太大差异,它应该符合您的要求。

谢谢,我意识到这是一个算法问题。使用toStream没有多大帮助,因为我的内存不足。再次感谢您,我必须消除编程中的惰性并在算法方面做得更好:)“我必须消除编程中的惰性并在算法方面做得更好:”。事实正好相反。你需要在编程方面做得更好,把懒惰融入到你的算法中:)@TheArchetypalPaul真的:)谢谢你,我意识到这是一个算法问题。使用toStream没有多大帮助,因为我的内存不足。再次感谢您,我必须消除编程中的惰性并在算法方面做得更好:)“我必须消除编程中的惰性并在算法方面做得更好:”。事实正好相反。你需要在编程方面做得更好,并将懒惰融入到你的算法中:)@TheArchetypalPaul true:)