oxb*_*kes 10 scala map out-of-memory immutability scala-2.7
如果我有一个不可变的地图,我可能期望(在很短的时间内 - 如几秒钟)添加/删除数十万个项目,标准HashMap是一个坏主意?假设我想在<10秒内通过Map传递1Gb数据,这样任何一次瞬间Map的最大大小只有256Mb.
我得到的印象是地图保留了某种"历史",但我将始终访问最后更新的表(即我不传递地图),因为它是一个私有成员变量,Actor只更新/访问从反应中.
基本上我怀疑这个数据结构可能(部分)因为在短时间内读取大量数据时JVM内存不足而出现问题.
我是否会更好地使用不同的地图实现,如果是这样,它是什么?
Rex*_*err 20
哎哟.为什么你必须使用不可变的地图?垃圾收集器差!除了(log n)时间之外,不可变映射通常需要(log n)每个操作的新对象,或者它们实际上只是将可变散列映射和层变换集包装在顶部(这会减慢速度并增加对象创建的数量).
不变性很好,但在我看来,这似乎不适合使用它.如果我是你,我会坚持下去scala.collection.mutable.HashMap.如果需要并发访问,请改为包装Java util.concurrent.
您还可能希望增加JVM中年轻代的大小:-Xmn1G或更多(假设您正在运行-Xmx3G).此外,使用吞吐量(并行)垃圾收集器.
那太糟糕了.你说你总是想要访问最后更新的表,这意味着你只需要一个短暂的数据结构,没有必要支付持久数据结构的成本- 就像交易时间和内存来获得完全可论证的"样式点" ".当你没有被要求时,你不是通过使用盲目持久的结构来建立你的业力.
此外,哈希表是一种特别难以持久化的结构.换句话说,"非常非常慢"(基本上,当读取数量大大超过写入数量时,它可用 - 而且您似乎谈论了许多写入).
顺便说一句,ConcurrentHashMap在这个设计中没有意义,因为地图是从一个演员那里访问的(这是我从描述中理解的).
| 归档时间: |
|
| 查看次数: |
4083 次 |
| 最近记录: |