我有一个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,而在内存使用方面不够精简。
是否有更有效的内存存储方式?
答案 0 :(得分:2)
我不会将您的解决方案归类为“ glib”。由于分配了Range
个值Int
,导致一些内存过度使用。范围的长度将为scores.keys.max
,但是大概您的T
值的内存分配会淹没此内存使用情况。
如果要避免这种初始分配,可以使用Iterator
:
Iterator
.range(0, scores.keys.max)
.map(i => input.get(i).orNull)
.toArray
这将避免创建Int值在内存中的序列,而是以惰性方式对每个索引进行操作。