轻量级地图实现Java(少量内存开销)

时间:2013-05-17 12:50:27

标签: java performance math memory-management collections

我目前正在用java编写一些代码,这些代码是一个项目的小框架,它围绕着一个包含数十亿条目的数据库。我希望保持高级别,并且从数据库中重新获得的数据应该可以轻松用于统计推断。我决定在这个项目中使用Map接口。

一个核心概念是在处理可读代码的单个数据集(我用它表示数据库中的列)时将属性(“数据库中的列”)映射到值(“单元格”):我使用枚举对象(命名属性类型的“属性”,意味着映射<Attribute, String>,因为数据元素都是String(也不是很大,最多40个字符左右)。 有15列,所以有15个枚举,地图只有很多或更少的条目。

所以看来,我会有大量的Map对象浮动,有时候,但是有效载荷相对较少(15-)。我的目标是,与实际有效负载相比,由于实现内存开销,不会使内存爆炸。 (拉伸目标:对cpu使用做同样的事情;])

到目前为止,我并不熟悉Java Collections的所有不同实现,当我今天遇到问题时,我查看了我迄今为止最喜欢的'HashMap',并且不满意多少已经声明了内存开销。我确信,对于标准实现而言,有许多实现没有随Java一起提供。谷歌搜索我的案子没有带来太大的结果,所以我问你:

你知道我的用例有一个很好的Map实现(低入口数,低值大小,可枚举键,......)

我希望我的用例清晰明了,并且对你的输入感到焦虑=) 非常感谢!


伸展答案目标,绝对可选,只有你有时间和知识: 集合的其他实现适用于:

  • 处理属性(String things)向量,以及推理数据的矩阵(计数/概率)(矩阵:这里我现在真的很无能,到目前为止还没有真正的java数学工作)
  • 用于统计推断的数学库,见上文

3 个答案:

答案 0 :(得分:6)

使用EnumMap,如果你有枚举作为关键,这是最好的地图实现,用于性能和内存使用。

诀窍是这个地图实现是唯一不存储键的地图实现,它只需要一个具有值的数组(类似于值的ArrayList)。如果没有映射到某个值的键,只会产生一些开销,但在大多数情况下,这不会成为问题,因为枚举通常没有太多实例。

HashMap相比,您还可以免费获得可预测的迭代顺序。

答案 1 :(得分:5)

由于您开始说要存储大量数据,最终,您还希望访问/修改该数据。那里有很多高性能的库。

看看

当您发现瓶颈时,您可以切换到使用较低级别的API(更高效)

如果再看一点,你会有更多的选择:What is the most efficient Java Collections library?

编辑:如果你的字符串不是唯一的,你可以使用String.intern()节省大量的内存:Is it good practice to use java.lang.String.intern()?

答案 2 :(得分:3)

您可以使用一个使用两个数组列表(键和值)的简单映射实现来挤出一些内存。对于较大的地图,这意味着插入和查找速度会变慢,因为您必须扫描整个列表。但是,对于小地图,它实际上更快,因为您不必计算任何哈希码,只需要查看少量条目。

如果您需要实现,请在我的jsonj项目中查看我的SimpleMap:https://github.com/jillesvangurp/jsonj/blob/master/src/main/java/com/github/jsonj/SimpleMap.java