2015-06-07 22 views
-1

是否存在高效的Scala多維數組,如Java中的?高效的多維度可變的Scala數組

我試圖解決Hackerrank嚴格的內存限制:256MB的問題。我的解決方案與內存不足的錯誤中斷,同時創造2D陣列(39384,39384)元素:

Array.ofDim[Long](39384,39384) 

在階控制檯同樣的情況。

java.lang.OutOfMemoryError: Java heap space 
     at scala.reflect.ManifestFactory$$anon$9.newArray(Manifest.scala:115) 
     at scala.reflect.ManifestFactory$$anon$9.newArray(Manifest.scala:113) 
     at scala.Array$.ofDim(Array.scala:222) 
     at Solution$.solve(Solution.scala:4) 
     at Solution$$anonfun$main$1.apply$mcVI$sp(Solution.scala:41) 
     at scala.collection.immutable.Range.foreach$mVc$sp(Range.scala:160) 
     at Solution$.main(Solution.scala:37) 
     at Solution.main(Solution.scala) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
     at java.lang.reflect.Method.invoke(Method.java:606) 
     at scala.reflect.internal.util.ScalaClassLoader$$anonfun$run$1.apply(ScalaClassLoader.scala:68) 
     at scala.reflect.internal.util.ScalaClassLoader$class.asContext(ScalaClassLoader.scala:31) 
     at scala.reflect.internal.util.ScalaClassLoader$URLClassLoader.asContext(ScalaClassLoader.scala:99) 
     at scala.reflect.internal.util.ScalaClassLoader$class.run(ScalaClassLoader.scala:68) 
     at scala.reflect.internal.util.ScalaClassLoader$URLClassLoader.run(ScalaClassLoader.scala:99) 
     at scala.tools.nsc.CommonRunner$class.run(ObjectRunner.scala:22) 
     at scala.tools.nsc.ObjectRunner$.run(ObjectRunner.scala:39) 
     at scala.tools.nsc.CommonRunner$class.runAndCatch(ObjectRunner.scala:29) 
     at scala.tools.nsc.ObjectRunner$.runAndCatch(ObjectRunner.scala:39) 
     at scala.tools.nsc.MainGenericRunner.runTarget$1(MainGenericRunner.scala:72) 
     at scala.tools.nsc.MainGenericRunner.process(MainGenericRunner.scala:94) 
     at scala.tools.nsc.MainGenericRunner$.main(MainGenericRunner.scala:103) 
     at scala.tools.nsc.MainGenericRunner.main(MainGenericRunner.scala) 
+0

您的多維數組會變得稀疏嗎?如果沒有,那麼就沒有辦法讓你的多暗數組「更高效」,因爲所有這些值都需要被存儲。您可以使用內存映射文件,或者如果您的機器具有內存,則可以在啓動時擴展JVM的最大內存。 –

回答

2

Array.ofDim[Long](39384,39384)創建具有大小39384 * 39384 * Long = 1551099456 * 8 = 11 Gb陣列這顯然多於256 Mb。只是儘量少維度來看看它是如何工作的:

scala> Array.ofDim[Long](3,3) 
res10: Array[Array[Long]] = Array(Array(0, 0, 0), Array(0, 0, 0), Array(0, 0, 0)) 

如果你需要一些座標處理大型幾何空間 - 你可能只是創造蓬的Map[Point, Long],像Map(Point(39382, 9000) -> 5L, Point(1,0) -> 9L)

如果你真的只需要兩個數組(每39384大小) - 然後就創建兩個數組Array.ofDim[Long](39384,2)

附:如果您的算法具有可伸縮性,您也可以使用Apache Spark的多個節點進行計算。

+0

在JVM堆中安裝這樣的數組是不可能的。我需要爲這個問題選擇不同的算法。 –