加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 08:48:41 所属栏目:安全 来源:网络整理
导读:假设我的流量为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
假设我的流量为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过滤器中没有这样的元素迭代所有百万个流并将所有元素放入记忆.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读