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过滤器中没有这样的元素迭代所有百万个流并将所有元素放入记忆. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |