如何修改笛卡尔积生成代码以解决内存溢出问题
解决Scala笛卡尔积内存溢出问题
原代码的核心问题是使用严格求值的Seq(默认实现为List),会一次性生成并存储所有笛卡尔积结果,当输入列表规模较大时,直接触发内存溢出。
修改方案是改用惰性求值的LazyList(Scala 2.13+版本推荐),它会按需生成元素,不会一次性把所有结果加载到内存:
case Nil => LazyList(LazyList.empty) case column :: others => others.foldLeft(LazyList(LazyList(column.apply(size)))) { case (product, values) => for { seq <- product value <- values.to(LazyList) } yield seq :+ value }
关键改动说明
- 将所有
Seq替换为LazyList:LazyList是惰性集合,元素仅在被访问时才会计算,不会提前占用内存。 - 对输入的
values调用.to(LazyList):确保遍历values时也是惰性的,避免提前加载全部元素。
如果使用的是Scala 2.12及更早版本,可以用Stream替代LazyList(两者行为类似,Stream是旧版惰性集合实现):
case Nil => Stream(Stream.empty) case column :: others => others.foldLeft(Stream(Stream(column.apply(size)))) { case (product, values) => for { seq <- product value <- values.toStream } yield seq :+ value }
内容的提问来源于stack exchange,提问作者Im89
相关产品推荐
相关产品推荐

