2013-05-11 15 views
6

我有一个语法正确的Scala源文件,其中包含一个巨大的数据结构。代码如下所示:斯卡拉不能处理巨大的物体?

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

所以你可以看到,对象包含了巨大的查找表,地图[诠释,数组[双] 10000项。编译需要大约一分钟,但完成时不会出现警告或错误。 但在运行时,它失败:

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

我使用Scala 2.9.2和Scala 2.10测试这一点。同样的结果。 当对象更小 - 比方说500个地图条目 - 程序起作用。 所以我猜scala无法处理这样的大文件。 任何解决方案建议?

+3

快速解决方案是从文件中读取这些值。 – 2013-05-11 17:37:47

+1

对om-nom-nom的评论+1。批量数据*从不*属于源代码! – 2013-05-11 20:07:55

回答

7

你是对的,你的语法看起来不错。

我令人失望的答案道歉,这是an open bug使用Scala:

Scala编程语言,SI-6543简单但冗长的重复脚本 斯卡拉编译失败(ClassNotFound的和/或的StackOverflowError)

它的修复优先级是Major(这是高),你可以find more information about it(他们解释为什么它发生)。

您可以跟踪进度。同时,您可以在平面文件中创建该信息,并从中读取数据作为临时修复。

+1

它对我来说看起来不是同样的错误。问题的错误与类文件格式有关。 – 2013-05-11 18:17:09

+0

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

+0

这是一个相关的错误。在错误报告中查看Phil Walker 19/Oct/12 7:13 PM的评论。这与一个大对象稍有不同的java.lang.ClassFormatError有关。我认为详细的错误信息取决于代码。 臭虫报告暗示我相信,看到这是一个斯卡拉错误。 – 2013-05-11 20:54:06