什么是内存有效的方法,可以有效地将键为索引的Scala映射转换为Array?

时间:2019-04-09 20:33:10

标签: arrays scala dictionary

我有一个Scala映射,其中的键表示索​​引,而值表示该索引的值。本质上,这是一个稀疏向量。

我希望将其转换为Java数组(供Spark使用)。

我正在使用:

def toArray[T](input: Map[Int, T]): Array[T] = (0 until scores.keys.max).map(i => input.get(i).orNull).toArray

此目的是在Spark应用程序中使用。我使用的T是一个Spark Vector,它可能很大(例如,成千上万的双精度数据,MB数据)。我担心我正在做的是glib,而在内存使用方面不够精简。

是否有更有效的内存存储方式?

1 个答案:

答案 0 :(得分:2)

我不会将您的解决方案归类为“ glib”。由于分配了Range个值Int,导致一些内存过度使用。范围的长度将为scores.keys.max,但是大概您的T值的内存分配会淹没此内存使用情况。

如果要避免这种初始分配,可以使用Iterator

Iterator
  .range(0, scores.keys.max)
  .map(i => input.get(i).orNull)
  .toArray

这将避免创建Int值在内存中的序列,而是以惰性方式对每个索引进行操作。