scala – Stream#filter为1,000,000个项目运行内存不足

发布时间:2020-10-21 发布网站:编程之家
编程之家收集整理的这篇文章主要介绍了scala – Stream#filter为1,000,000个项目运行内存不足编程之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
假设我的流量为1,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异常.

然后,我尝试使用List进行相同的过滤器调用.

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

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

但它成功了.

为什么Stream#filter在这里耗尽内存,但List#过滤器完成得很好?

最后,对于大流,会过滤导致整个流的非惰性评估吗?

解决方法

列表的开销 – 单个对象(实例::)每个元素有2个字段(2个指针).

Stream的开销 – Cons的实例(具有3个指针)加上Function的实例(tl:=> Stream [A]),用于对每个元素的Stream#tail进行延迟评估.

因此,您将在Stream上花费大约2倍的内存.

您已将Stream定义为val.或者你可以将百万作为def定义 – 在这种情况下,过滤器GC将删除所有创建的元素,然后你将获得你的记忆.

请注意,只有Stream中的尾部是惰性的,head是严格的,因此filter会严格评估,直到它获得满足给定谓词的第一个元素,并且因为Stream过滤器中没有这样的元素迭代所有百万个流并将所有元素放入记忆.

总结

以上是编程之家为你收集整理的scala – Stream#filter为1,000,000个项目运行内存不足全部内容,希望文章能够帮你解决scala – Stream#filter为1,000,000个项目运行内存不足所遇到的程序开发问题。

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您喜欢交流学习经验,点击链接加入编程之家官方QQ群:1065694478
编程之家官方公众号

微信公众号搜索 “ 程序精选 ” ,选择关注!

微信公众号搜索 “ 程序精选 ”
精选程序员所需精品干货内容!