2013-05-11 13 views
6

Ho un file sorgente Scala sintatticamente corretto che contiene un'enorme struttura dati. Il codice è simile al seguente:Scala non può occuparsi di oggetti enormi?

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) 
) 
} 

Così si può vedere, l'oggetto contiene una tabella di ricerca enorme, una mappa [Int, Array [Doppia]] con 10000 voci. La compilazione impiega circa un minuto, ma termina senza avvertimenti o errori. Ma in fase di esecuzione non riesce con:

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 ... 

Ho provato questo con scala 2.9.2 e Scala 2.10. Stesso risultato Quando l'oggetto è molto più piccolo - diciamo 500 voci di mappa - il programma funziona. Quindi immagino che scala non sia in grado di gestire file così grandi. Qualche proposta di soluzione?

+3

La soluzione rapida è leggere quei valori dal file. –

+1

+1 sul commento di om-nom-nom. Dati in blocco * mai * appartiene al codice sorgente! –

risposta

7

Sei corretto, la tua sintassi sembra corretta.

Mi scuso per la risposta deludente, questo è an open bug con Scala:

Scala linguaggio di programmazione SI-6543 scala di compilazione fallisce il semplice ma lunga copione ripetitivo (ClassNotFound e/o StackOverflowError)

È la priorità fissa è Maggiore (che è alta) e è possibile find more information about it (spiegano perché si verifica).

È possibile tenere traccia dell'avanzamento. Nel frattempo, è possibile creare tali informazioni in un file flat e leggere i dati da esso come una soluzione temporanea.

+1

Non mi sembra affatto lo stesso errore. L'errore della domanda è correlato a un formato di file di classe. –

+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

È un parente bug. Vedi il commento di Phil Walker 19/Oct/12 7:13 PM nel bug report. si tratta di un java.lang.ClassFormatError leggermente diverso con un oggetto grande. Penso che il messaggio di errore dettagliato dipende dal codice. Il bug report mi ha convinto, per vedere che è un bug di Scala. –

Problemi correlati