首页 > 解决方案 > 什么是有效地将键是索引的 Scala Map 转换为 Array 的内存有效方法?

问题描述

我有一个 Scala Map,其中键代表索引,值代表该索引的值。本质上,这是一个稀疏向量。

我希望将其转换为 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 并且在内存使用方面不够简洁。

有没有更有效的内存方法来做到这一点?

标签: arraysscaladictionary

解决方案


我不会将您的解决方案归类为“glib”。由于分配 a of值,存在一些内存过度使用。Range 的长度将为,但可能此内存使用量被您的值的内存分配所淹没。RangeIntscores.keys.maxT

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

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

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


推荐阅读