在Scala中创建大量数组

时间:2016-06-01 03:41:28

标签: arrays scala matrix

我们知道在scala中,要创建一个2D数组(矩阵),使用ofDim:

def ofDim[T]( n1: Int, n2: Int ): Array[Array[T]]

其中参数只接受Int类型。

如果我想创建一个包含大量元素的2D数组,那么应该使用多长时间?而不是Dim,我还能用什么呢?

感谢。

1 个答案:

答案 0 :(得分:6)

即使您有足够的内存来存储数据类型超过2 ^ 31-1个元素,JVM也会将数组限制为最多2 ^ 31-1。

所以简短的回答是:你不能。而且你可能还没有足够的记忆力。

但是如果你这样做,你可以创建自己的类,将一个数组数组包装为一个数组:

class BigArray[@specialized T: reflect.ClassTag](size: Long) {
  private val data = Array.ofDim(1 + (size >> 20).toInt, math.min(size, 1L << 20).toInt)
  def apply(i: Long): T = data((i >> 20).toInt)((i & ((1 << 20)-1)).toInt)
  def update(i: Long, value: T) {
    data((i >> 20).toInt)((i & ((1 << 20)-1)).toInt) = value
  }
}

然后使用它。请注意,尝试将大量数据放入大多数现有集合类型中会破坏它,因此您可能只需要使用旧式(手动)方式对其进行索引。

现在您已经拥有了这个,您可以创建BigArrays的BigArrays并手动索引它们以放置元素(并初始化空的BigArrays)。

但是,可能有更好的方法来解决让你想要创建如此庞大阵列的问题。