2016-05-29 3 views
0

Die Art, wie ich Ansichtsstruktur in Scala verstehe, ist diese Ansicht ist eine faule Sammlung und ist nicht mit echten Sammlung Mitglieder gefüllt, bevor sie zugegriffen werden. Mit dieser Beschreibung der Ansicht soll die folgende Codezeile nicht einen Fehler aus:Ansicht auf Bereich verursacht nicht genügend Speicher Fehler in Scala

val a = (0 to 123456789).view 

und da es nicht erwartet hat. I (höchstwahrscheinlich falsch) annehmen, die folgende Codezeile zu dem obigen Code äquivalent und soll nicht einen außerhalb des Speicherfehlers werfen entweder:

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

aber es erzeugt einen „java.lang.OutOfMemoryError: Java Heap-Speicher " Error. Irgendeine Idee, warum sich diese beiden Codezeilen anders verhalten?

Antwort

3

des Lassen brechen ...

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 gefolgert (Presse Ctr-Q) daß b1 ein Array ist.

Lasst uns die Dokumentation prüfen "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) 

Der Fehler aus der Leitung kommt, wo man Array.range nennen ...

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) 

Sie eine gerade zugewiesen Array mit 123456790 Elementen darin, weshalb Sie einen Fehler "java.lang.OutOfMemoryError: Java-Heap-Space" erhalten haben.

+0

also, wenn ich richtig verstehe, Scala Compiler ist nicht intelligent genug, um diese beiden Schritte zu kombinieren? – TNM

+3

@TNM - Dies ist nicht genau ein Fall von "nicht intelligent genug", sondern "tun, wonach Sie fragen". Der Compiler ist auch nicht in der Lage, diese Art von Kombination zu machen (im Allgemeinen sowieso; es gibt spezielle Fälle, die der Optimierer bekommt), aber in diesem Fall sollte er sowieso nichts anderes tun, da Sie vermutlich einen guten Grund dafür hatten eine Ansicht, die von einem Array im Gegensatz zu einem Bereich unterstützt wird. –