Stream#filter 1,000,000 个项目内存不足

2023-12-23

假设我有一个Stream长度1,000,000全部为 1。

scala> val million = Stream.fill(100000000)(1)
million: scala.collection.immutable.Stream[Int] = Stream(1, ?)

scala> million filter (x => x % 2 == 0)
Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded

我得到一个Out of Memory例外。

然后,我也尝试了同样的方法filter打电话给List.

scala> val y = List.fill(1000000)(1)
y: List[Int] = List(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ...

scala> y.filter(x => x % 2 == 0)
res2: List[Int] = List()

但它成功了。

为什么Stream#filter这里内存不足,但是List#filter完成得很好吗?

最后,随着大流,将filter导致整个流的非惰性评估?


开销List- 单个对象(实例::)每个元素有 2 个字段(2 个指针)。

开销Stream- 实例Cons(有3个指针)加上一个实例Function (tl: => Stream[A])用于惰性评估Stream#tail每个元素。

所以你会花费大约 2 倍的内存Stream.

你已经定义了你的Stream as val。或者你可以定义million as def- 在这种情况下之后filterGC 将删除所有创建的元素,您将恢复记忆。

请注意,仅tail in Stream是懒惰,head是严格的,所以filter严格评估,直到它获得满足给定谓词的第一个元素,并且因为您的中没有这样的元素Stream filter迭代你所有的million流并将所有元素放入内存中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Stream#filter 1,000,000 个项目内存不足 的相关文章

随机推荐