3

我目前正在用 java 编写一些代码,旨在成为一个项目的小框架,该项目围绕具有数十亿个条目的数据库展开。我想保持高水平,从数据库中检索的数据应该很容易用于统计推断。我决定在这个项目中使用 Map 接口。

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

所以看起来,我有时会有大量的 Map 对象漂浮在周围,但有效载荷相对较少(15-)。与实际有效负载相比,我的目标是不因实现内存开销而导致内存爆炸。(延伸目标:对 cpu 使用做同样的事情;])

迄今为止,我对 Java 集合的所有不同实现并不十分熟悉,当我今天遇到问题时,我查看了迄今为止我最喜欢的“HashMap”,并且对那里的内存开销不满意被宣布。我敢肯定,除了标准实现之外,还有许多 Java 未附带的实现。谷歌搜索我的案子没有什么结果,所以我问你:

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

我希望我把我的用例说清楚了,我很期待你的意见 =) 非常感谢!


扩展答案目标,绝对可选,并且只有在您有时间和知识的情况下:集合的其他实现适用于:

  • 处理属性(字符串的东西)向量和推理数据的矩阵(计数/概率)(矩阵:在这里我现在真的一无所知,到目前为止真的没有用 java 进行认真的数学工作)
  • 用于统计推断的数学库,见上文
4

3 回答 3

7

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

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

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

于 2013-05-17T17:20:15.747 回答
5

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

看着

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

多看一点,你会有更多选择: 什么是最高效的 Java Collections 库?

编辑:如果您的字符串不是唯一的,您可以使用 String.intern() 节省大量内存:使用 java.lang.String.intern() 是一种好习惯吗?

于 2013-05-17T13:13:27.090 回答
3

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

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

于 2013-05-17T13:00:09.913 回答