2012-03-07 121 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