2012-03-07 135 views
3

我有这样的代码:这为什么会导致编译器崩溃?

var nodeMap:Map[Int, List[Node]] = Map[Int, List[Node]]() 

nodeMap = Map[Int, List[Node]]() ++ nodes.par.groupBy(x => x.getClosest(centers)) 

x.getClosest返回一个int。当我去编译这个时,编译器崩溃,说它内存不足。但是,当我这样做:

var nodeMap:Map[Int, List[Node]] = Map[Int, List[Node]]() 

nodeMap = nodes.groupBy(x => x.getClosest(centers)) 

它工作正常。

为什么?

+2

因为编译器中存在一个错误。你在寻找什么样的答案?我建议你找到合适的地方并报告问题。 – jdigital 2012-03-07 01:08:43

+0

我希望能够解决这个问题,或者解释它为什么会发生(如果它不是一个编译器代码,而是实现中的某些东西)。 – dave 2012-03-07 01:26:05

+0

编译器不应该耗尽内存。它并不是真的在运行这个东西。至于解决方法,我会使用'toMap'方法(反正更好),或者如果你坚持使用变量,'nodeMap ++ =' – 2012-03-07 04:28:05

回答

5

Scala编译器在复杂表达式中存在一些问题;如果内存不足(即OutOfMemoryException),则可能是一个错误,但编译器用完堆栈空间的情况更为常见,在这种情况下,您可以添加标记-Xss=256m(其中数字显然取决于您)来解决这个问题。这对于复杂表达式(例如字符串和列表连接)特别常见。

+1

'256m'堆栈空间有点......极端。即使在最极端的情况下,3m对我来说也是足够的。 – 2012-03-07 20:57:29

+0

我相信这是最大的,是的,这绝对是极端的。尽管如此,我遇到了一些情况(特别是Scala编译器),即使是128m也不足以满足某些表达式。不同的架构可能会有不同的数字,32位和64位等 – 2012-03-08 08:29:47

相关问题