在Scala中创建大量数组

phi*_*hil 2 arrays scala matrix

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

def ofDim[T]( n1: Int, n2: Int ): Array[Array[T]]
Run Code Online (Sandbox Code Playgroud)

其中参数只接受Int类型.

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

谢谢.

Rex*_*err 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
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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

但是,可能有更好的方法来解决使您想要创建如此庞大的数组的问题.