【问题标题】:View on range causes out of memory error in scala查看范围导致scala中的内存不足错误
【发布时间】:2016-09-27 14:01:30
【问题描述】:

我理解 scala 中的视图结构的方式是,视图是一个惰性集合,并且在访问它们之前没有填充真正的集合成员。 有了这个视图描述,下面这行代码应该不会报错:

val a = (0 to 123456789).view

正如预期的那样,它没有。我(很可能是错误的)假设以下代码行等同于上面的代码,也不应该抛出内存不足错误:

val a = Array.range(0,123456789).view

但它会生成“java.lang.OutOfMemoryError: Java heap space”错误。知道为什么这两行代码的行为不同吗?

【问题讨论】:

    标签: arrays scala view collections


    【解决方案1】:

    我们分手吧……

    val a1: Range.Inclusive = (0 to 123456789)
    val a2: AnyRef with SeqView[Int, IndexedSeq[Int]] = a1.view
    
    val b1: Array[Int] = Array.range(0,123456789)
    val b2: AnyRef with mutable.IndexedSeqView[Int, Array[Int]] = b1.view
    

    IntelliJ 推断(按 Ctr-Q)b1 是一个数组。

    让我们检查一下“Array.range”的文档...

      /** Returns an array containing a sequence of increasing integers in a range.
       *
       *  @param start  the start value of the array
       *  @param end    the end value of the array, exclusive (in other words, this is the first value '''not''' returned)
       *  @return  the array with values in range `start, start + 1, ..., end - 1`
       *  up to, but excluding, `end`.
       */
      def range(start: Int, end: Int): Array[Int] = range(start, end, 1)
    

    错误来自您调用Array.range...的行...

    Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
        at scala.collection.mutable.ArrayBuilder$ofInt.mkArray(ArrayBuilder.scala:323)
        at scala.collection.mutable.ArrayBuilder$ofInt.resize(ArrayBuilder.scala:329)
        at scala.collection.mutable.ArrayBuilder$ofInt.sizeHint(ArrayBuilder.scala:334)
        at scala.Array$.range(Array.scala:402)
        at scala.Array$.range(Array.scala:390)
        at pkg.Main$.main(Main.scala:57)
        at pkg.Main.main(Main.scala)
    

    您刚刚分配了一个包含 123456790 个元素的数组,这就是您收到“java.lang.OutOfMemoryError: Java heap space”错误的原因。

    【讨论】:

    • 所以如果我理解正确的话,Scala 编译器不够智能,无法将这两个步骤结合起来?
    • @TNM - 这不完全是“不够聪明”的情况,而是“按照你的要求做”。编译器也不能做这种组合(一般来说,无论如何;优化器会得到一些特殊情况),但在这种情况下,它不应该做任何不同的事情,因为大概你有充分的理由要求由数组支持的视图,而不是范围。
    猜你喜欢
    • 2011-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-26
    • 1970-01-01
    • 1970-01-01
    • 2014-01-25
    相关资源
    最近更新 更多