2016-05-29 5 views
0

スカラのビュー構造を理解する方法は、ビューが遅延コレクションであり、アクセスする前に実際のコレクションメンバーで満たされていないことです。ビューのこの説明では は、次のコード行は、エラーをスローべきではありません。範囲外のビューでスケーラのメモリ不足エラーが発生する

val a = (0 to 123456789).view 

をし、期待どおりにはしていません。 I(おそらく誤って)次のコード行は、上記のコードと同等であると仮定し、メモリ不足エラーをスローしてはいけません、次のいずれか

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

が、それは「java.lang.OutOfMemoryErrorを生成します:Javaヒープスペースを"エラー。これらの2行のコードが異なる動作をする理由は何ですか?

答えて

3

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のは、B1が配列であること(プレスセンター-Q)を推測します。あなただけ割り当てられ

/** 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) 

さんは "Array.range" のドキュメントを確認してみましょう

...その中に123456790要素の配列があります。そのため、「java.lang.OutOfMemoryError:Java heap space」エラーが発生しました。

+0

私が正しく理解していれば、Scalaコンパイラはこれら2つのステップを組み合わせるのに十分にインテリジェントではありませんか? – TNM

+3

@TNM - これはまさに「知的ではない」のではなく、「求めていることをやっている」ことです。コンパイラもこの種の組み合わせを行うことはできません(とにかく、オプティマイザが取得する特殊なケースがあります)が、この場合は、おそらく何か別のことはしないでください。範囲とは対照的に配列によって支持されたビュー。 –

関連する問題