从存储的角度来看,Scala 如何在内部表示不可变映射?

How does Scala represent immutable maps internally from storage standpoint?

我在 Spark-graphx 上有一个 scala 应用程序。 VD 包含一个 Map[Long, Map[Long, Double]] ,它需要随着每次迭代而增长。两者都是从 List.toMap 创建的,因此 AFAIK 内部和外部都应该是不可变的。我对非常大的图形数据集的 运行 理解为什么在 Pregel AI 的文档中它说理想情况下 VD 不应该增长 - 我得到了可怕的“缺少 shuffle n 的输出位置分区 m”,即 OOM。

所以我的问题是 - scala 内部如何存储不可变映射? 如果我知道映射的内存使用情况,那么我可以初始化每个 VD每个顶点可以“交换”地图大小的一些占位符字节,这样整体大小就不会(显着)增长。这不是最优雅的解决方案,但我想不出针对这个特定问题的另一个解决方案。

或者,如果有人可以提出更好的方法来处理 VD 中的这种数据积累,那么我也愿意接受这样的建议。

以间接的方式回答我自己的问题:有一篇非常好的文档:https://spark.apache.org/docs/latest/tuning.html 讨论了 Java 类型(包括映射)的开销以及如何减少开销。所以有了这些知识,我已经完全抛弃了地图,我不需要想出一个丑陋的“镇流器”方法来确保 VD 内存使用的稳定性。