【问题标题】:Scala can't deal with huge objects?Scala 不能处理巨大的对象?
【发布时间】:2013-05-11 17:34:27
【问题描述】:

我有一个语法正确的 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 个条目的 Map[Int, Array[Double]]。 编译大约需要一分钟,但在没有警告或错误的情况下完成。 但在运行时它会失败:

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无法处理这么大的文件。 有什么解决方案吗?

【问题讨论】:

  • 快速的解决方案是从文件中读取这些值。
  • +1 对 om-nom-nom 的评论。批量数据从不属于源代码!

标签: scala


【解决方案1】:

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

对于令人失望的答案,我深表歉意,这是 an open bug with Scala:

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

它的修复优先级是 Major(很高),您可以 find more information about it(他们解释了为什么会发生这种情况)。

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

【讨论】:

  • 对我来说这根本不像是同样的错误。问题的错误与类文件格式有关。
  • 这是一个相关的错误。请参阅错误报告中来自 Phil Walker 19/Oct/12 7:13 PM 的评论。这是关于一个稍有不同的 java.lang.ClassFormatError 与一个大对象。我认为详细的错误消息取决于代码。错误报告提示让我相信,这是一个 Scala 错误。
  • @BitMagier 请注意,错误报告包含导致ClassFormatError 的文件示例以及带有此类文件的附件。我认为您应该对该错误报告发表评论并提及您遇到了同样的问题(添加输入文件)。我确定它有帮助
  • 不知道为什么,但我无法重现我昨天发布的 ClassFormatError。 Scala 2.9.2 编译器在 25 分钟后没有返回。使用 Scala 2.10,我得到一个 NoClassDefFoundError,如 issues.scala-lang.org/browse/SI-6543。我添加了我的问题。
猜你喜欢
  • 2012-01-20
  • 2019-03-18
  • 1970-01-01
  • 2014-10-21
  • 2013-09-28
  • 1970-01-01
  • 1970-01-01
  • 2011-08-31
  • 2011-02-12
相关资源
最近更新 更多