2013-05-11 6 views
6

Ich habe eine syntaktisch korrekte Scala-Quelldatei mit einer riesigen Datenstruktur. Der Code sieht wie folgt aus:Scala kann nicht mit riesigen Objekten umgehen?

object ChiSquareAlpha 
{ 
    val ChiSquareToAlphaIndexTable = Map(
    1 -> Array(0.00016,0.00063,0.00393,0.01579,0.06418,0.14847,0.45494,1.07419,1.64237,2.70554,3.84146,5.41189,6.63490,10.82757), 
    .. 9998 other entries .. 
    10000 -> Array(9673.95,9711.71,9768.53,9819.19,9880.79,9925.36,9999.33,10073.68,10118.82,10181.66,10233.75,10292.58,10331.93,10442.73) 
) 
} 

So können Sie sehen, hält das Objekt eine große Lookup-Tabelle, eine Map [Int, Array [Double]] mit 10000 Einträgen. Die Kompilierung dauert ungefähr eine Minute, endet jedoch ohne Warnungen oder Fehler. zur Laufzeit mit aber es funktioniert nicht:

java.lang.ClassFormatError: Invalid this class index 4280 in constant pool in class file bm/statistic/ChiSquareAlpha$ 
at java.lang.ClassLoader.defineClass1(Native Method) 
at java.lang.ClassLoader.defineClass(ClassLoader.java:791) 
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) 
at java.net.URLClassLoader.defineClass(URLClassLoader.java:449) 
at java.net.URLClassLoader.access$100(URLClassLoader.java:71) 
at java.net.URLClassLoader$1.run(URLClassLoader.java:361) 
at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.net.URLClassLoader.findClass(URLClassLoader.java:354) 
at scala.tools.nsc.util.ScalaClassLoader$URLClassLoader.scala$tools$nsc$util$ScalaClassLoader$$super$findClass(ScalaClassLoader.scala:88) 
at scala.tools.nsc.util.ScalaClassLoader$class.findClass(ScalaClassLoader.scala:44) 
at scala.tools.nsc.util.ScalaClassLoader$URLClassLoader.findClass(ScalaClassLoader.scala:88) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:423) 
at scala.tools.nsc.util.ScalaClassLoader$URLClassLoader.scala$tools$nsc$util$ScalaClassLoader$$super$loadClass(ScalaClassLoader.scala:88) 
at scala.tools.nsc.util.ScalaClassLoader$class.loadClass(ScalaClassLoader.scala:50) 
at scala.tools.nsc.util.ScalaClassLoader$URLClassLoader.loadClass(ScalaClassLoader.scala:88) 
at java.lang.ClassLoader.loadClass(ClassLoader.java:356) 
at bm.statistic.ChiSquareTest.testOfIndependence(ChiSquareTest.scala:323) 
at ... 

ich dies mit scala getestet 2.9.2 und scala 2.10. Gleiches Ergebnis. Wenn das Objekt viel kleiner ist - sagen wir 500 Karteneinträge - funktioniert das Programm. Also ich denke, Scala ist nicht in der Lage, mit so großen Dateien umzugehen. Irgendwelche Lösungsvorschläge?

+3

Die schnelle Lösung besteht darin, diese Werte aus der Datei zu lesen. –

+1

+1 auf omm-nom-nom's Kommentar. Massendaten * nie * gehört in den Quellcode! –

Antwort

7

Sie haben Recht, Ihre Syntax sieht gut aus.

ich für die enttäuschende Antwort entschuldigen, das ist an open bug mit Scala:

Scala Programmiersprache SI-6543 scala Kompilierung auf einfache, aber lange sich wiederholende Skript fehlschlägt (ClassNotFound und/oder Stackoverflow)

Es ist feste Priorität ist Major (was hoch ist) und Sie können find more information about it (sie erklären warum es passiert).

Sie können den Fortschritt verfolgen. In der Zwischenzeit können Sie diese Informationen in einer einfachen Datei erstellen und die Daten daraus als temporäre Korrektur lesen.

+1

Es sieht für mich überhaupt nicht nach dem gleichen Fehler aus. Der Fehler der Frage bezieht sich auf ein Klassendateiformat. –

+0

@ DanielC.Sobral https://issues.scala-lang.org/browse/SI-6543?focusedCommentId=60494&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-60494 –

+0

Es ist eine verwandte Fehler. Siehe Kommentar von Phil Walker 19/Oct/12 7:13 PM im Fehlerbericht. Dies ist ein etwas anderer java.lang.ClassFormatError mit einem großen Objekt. Ich denke die detaillierte Fehlermeldung hängt vom Code ab. Der Bug-Report-Hinweis hat mich überzeugt, dass es sich um einen Scala-Bug handelt. –

Verwandte Themen