2016-12-12 12 views
4

私はスカラーREPL 2.11.8で1000個のフィールドを持つ1つのケースクラスを定義しようとしています。 caseクラスの定義は次のようになります:scala caseクラスが多すぎます

case class Step2_Class(
    `Response` : String, 
    `D1` : String, 
    `D2` : String, 
    `D3` : String, 
    `D4` : String, 
    //......, 
    `D999` : String, 
    `D1000` : String) 

そしてREPLは応答を待っています。約1時間後、スタックオーバーフローの例外がスローされます。

java.lang.StackOverflowError 
    at scala.reflect.internal.Trees$class.traverseComponents$1(Trees.scala:1294) 
    at scala.reflect.internal.Trees$class.itraverse(Trees.scala:1330) 
    at scala.reflect.internal.SymbolTable.itraverse(SymbolTable.scala:16) 
    at scala.reflect.internal.SymbolTable.itraverse(SymbolTable.scala:16) 
    at scala.reflect.api.Trees$Traverser.traverse(Trees.scala:2475) 
    at scala.reflect.internal.Positions$DefaultPosAssigner.traverse(Positions.scala:288) 
    at scala.reflect.internal.Positions$DefaultPosAssigner.traverse(Positions.scala:282) 
    at scala.reflect.internal.Trees$class.traverseComponents$1(Trees.scala:1283) 
    at scala.reflect.internal.Trees$class.itraverse(Trees.scala:1330) 

ご意見はありますか?スカラーはそのようなケースをサポートしていませんか?回避策はありますか?

+5

なぜ1000のフィールドを持つクラスが必要ですか? – Pavel

+0

フィールドの名前が「D1」から「D1000」の場合、代わりに配列を使用しないのはなぜですか? – Thomas

+1

代わりにこれをやってみたことがありますか? 'case class Step2_Class(レスポンス:String、theDs:List [String])'? – marstran

答えて

6

エラーはフィールドの数に関係していないようです。

あなたはしばらくしてから壊れたと言いました。あなたは戻り条件のない再帰関数を持っていないと確信していますか? infactは実行時エラーです。

のアプリケーションの再帰が深すぎるためにスタックオーバーフローが発生した場合にスローされます

問題がフィールドの数に関連する場合は、コンパイル時に表示されます。

問題はフィールドの数に関係しませんが、1000個のパラメータを持つコードまたは1000個のフィールドを持つクラスを作成することは非常に悪い考えです。あなたはD1とD15とD1000の間に本当の違いはないと想像しているように、なぜDという配列を使わないのですか?

+1

あなたが欠けているのは、コンパイラ_itself_がスタックオーバーフローエラーを含む実行時例外をスローし、スタック内の 'scala.reflect.internal.Trees'から判断できないということですそれは何が起こるかをトレースします(マクロ呼び出しもそれにつながる可能性があります)。 –

1

最近まで、ケースクラスには22フィールドの制限がありました。したがって、コンパイラ(またはREPL自体)が1000個のフィールドを正常に処理できない場合は驚くことではありません。 JAVA_OPTS(特にスタックオーバーフローの場合は-Xss)を設定することで、より多くのメモリ(特にスタックメモリ)を試すことができます。

JAVA_OPTS="$JAVA_OPTS -Xss8M" scala 

しかし、あなたは(それはかなり可能である、主にこだわっガベージコレクション、でない限り)、それはスピードにあまり役に立たないだろうどのくらいの推測する必要があるだろう、それはより多くのフィールドで失敗する可能性があります。

関連する問題