高效的多维可变 Scala 数组
Efficient Multi dimenstion Mutable Scala Array
是否有内存高效的 Scala 多维数组,例如 Java?
我正在尝试解决 Hackerrank 内存限制严格的问题:256mb。我的解决方案在使用 (39384,39384) 元素创建二维数组时因内存不足错误而中断:
Array.ofDim[Long](39384,39384)
scala 控制台中也会发生同样的情况。
java.lang.OutOfMemoryError: Java heap space
at scala.reflect.ManifestFactory$$anon.newArray(Manifest.scala:115)
at scala.reflect.ManifestFactory$$anon.newArray(Manifest.scala:113)
at scala.Array$.ofDim(Array.scala:222)
at Solution$.solve(Solution.scala:4)
at Solution$$anonfun$main.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.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(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)
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))
如果您需要对大型几何图形进行一些坐标处理 space - 您可以创建 Map[Point, Long]
个桥,例如 Map(Point(39382, 9000) -> 5L, Point(1,0) -> 9L)
。
如果您实际上只需要两个数组(每个数组大小为 39384)- 那么只需创建两个数组 Array.ofDim[Long](39384,2)
P.S。如果您的算法具有可扩展性,您还可以使用 Apache Spark 的多个节点进行计算。
是否有内存高效的 Scala 多维数组,例如 Java?
我正在尝试解决 Hackerrank 内存限制严格的问题:256mb。我的解决方案在使用 (39384,39384) 元素创建二维数组时因内存不足错误而中断:
Array.ofDim[Long](39384,39384)
scala 控制台中也会发生同样的情况。
java.lang.OutOfMemoryError: Java heap space
at scala.reflect.ManifestFactory$$anon.newArray(Manifest.scala:115)
at scala.reflect.ManifestFactory$$anon.newArray(Manifest.scala:113)
at scala.Array$.ofDim(Array.scala:222)
at Solution$.solve(Solution.scala:4)
at Solution$$anonfun$main.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.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(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)
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))
如果您需要对大型几何图形进行一些坐标处理 space - 您可以创建 Map[Point, Long]
个桥,例如 Map(Point(39382, 9000) -> 5L, Point(1,0) -> 9L)
。
如果您实际上只需要两个数组(每个数组大小为 39384)- 那么只需创建两个数组 Array.ofDim[Long](39384,2)
P.S。如果您的算法具有可扩展性,您还可以使用 Apache Spark 的多个节点进行计算。