如果我有 不变 我可能期望的地图(在很短的时间内 - 像几秒钟一样)正在添加/删除 数十万 项目的标准是 HashMap 一个坏主意?假设我想在<10秒内通过地图传递1GB数据,以使地图的最大尺寸仅为256MB。

我的印象是该地图保留了某种“历史”,但我会 总是 访问最后一个更新的表(即我不传递地图),因为它是一个私人成员变量 Actor 仅在反应内更新/访问。

基本上,我怀疑这种数据结构可能(部分)是故障 对于我在JVM上看到的问题 在短时间内阅读大量数据时。

我会在不同的地图实现中变得更好,如果是的话,这是什么?

有帮助吗?

解决方案

哎哟。为什么必须使用不变的地图?可怜的垃圾收集器!不变的地图通常需要(log n)每个操作除(log n)时间之外,或者它们实际上只是在顶部包裹可变的哈希地图和层更改(这会减慢事物的速度并增加对象创建的数量)。

不变性很棒,但这在我看来并不像使用它的时间。如果我是你,我会坚持 scala.collection.mutable.HashMap. 。如果需要并发访问,请改用Java Util.concurrent One。

您可能还想增加JVM年轻一代的规模: -Xmn1G 或更多(假设您正在与 -Xmx3G)。另外,使用吞吐量(平行)垃圾收集器。

其他提示

那太糟糕了。您说您始终想访问最后一个更新的桌子,这意味着您只需要一个 短暂 数据结构,无需支付费用 执着的 数据结构 - 就像交易时间和内存一样,获得完全可争议的“样式点”。你是 不是 当不要求业力时,通过盲目持久结构来构建业力。

同样,散布是一个特别困难的结构。换句话说,“非常非常慢”(基本上,当阅读次数大得多时,它是可用的 - 而且您似乎谈论许多写作)。

顺便说一句 ConcurrentHashMap 鉴于从单个演员访问地图(这就是我从描述中了解的),因此在此设计中没有意义。

Scala的所谓(*)不变地图被打破了基本用法,直到Scala 2.7。不要相信我,只需查找公开票的数量即可。该解决方案只是“它将被Scala 2.8上的其他东西替换”(确实如此)。

因此,如果您想要Scala 2.7.x的不变地图,我建议您在Scala以外的其他内容中寻找它。或者只是使用treehashmap。

(*)Scala的不变地图并不是真正不可变的。它是内部可变的数据结构,需要大量同步。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top