arrays - 什么是有效地将键是索引的 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 并且在内存使用方面不够简洁。
有没有更有效的内存方法来做到这一点?
解决方案
我不会将您的解决方案归类为“glib”。由于分配 a of值,存在一些内存过度使用。Range 的长度将为,但可能此内存使用量被您的值的内存分配所淹没。Range
Int
scores.keys.max
T
如果您想避免这种初始分配,您可以使用Iterator
:
Iterator
.range(0, scores.keys.max)
.map(i => input.get(i).orNull)
.toArray
这将避免在内存中创建 Int 值序列,而是以惰性方式对每个索引进行操作。
推荐阅读
- python - 试图指定命令行参数但无法弄清楚 - 不完全确定 optparse 中的 'dest' 和 'store' 做什么
- google-cloud-platform - 使用 Dataproc 将 Google Pub/Sub 与 Flink Streaming 结合使用的正确方法是什么?
- azure - 我可以从 .ps1 文件运行 powershell 命令吗?
- sql - 更新表错误:无法修改映射到非键保留表的列
- algorithm - 递归关系的时间复杂度:T(n) = nT(n^1/2)+ O(1)
- scala - 从 Spark 中的 Driver 访问任务进度
- ios - 如何修复 iOS 崩溃“com.apple.main-thread SIGABRT ABORT”
- mongodb - 在 Express 中哪里可以找到 Mongo Collection?
- perl - Perl 试图理解正则表达式调试输出
- android - 我可以安全地从我的 google-services.json 文件中删除除当前应用程序数据之外的所有应用程序数据吗?