【发布时间】:2017-01-25 01:08:28
【问题描述】:
我有一个相当大的数据集,包含 2.3GB 的数据,分布在 1.6 亿字节 [] 数组中,平均数据长度为 15 字节。每个 byte[] 键的值只是一个 int,因此将近一半的 hashmap(超过 6GB)的内存使用量由每个字节数组的 16 字节开销组成
开销 = 8 字节标头 + 4 字节长度由 VM 四舍五入到 16 字节。
所以我的开销是 2.5GB。
是否有人知道将其(可变长度)字节 [] 键存储在一个大字节数组中的 hashmap 实现,因此不会有任何开销(除了 1 字节长度字段)?
我宁愿不使用内存数据库,因为与我正在使用的普通 Trove TObjectIntHashMap 相比,它们通常具有性能开销,而且我更重视 CPU 周期而不是内存使用量。
提前致谢
【问题讨论】:
-
数组没有实现 equals() 或 hashCode(),你的 Trove hashmap 是否为你提供了这些?
-
你为什么使用
byte[]作为你的hashmap的key? -
你使用的是什么 JVM?我的印象是,如果
byte[]的长度是奇数,开销只会是 12 个字节,因为只是整个结构被四舍五入到 8 的倍数。 -
我用 >new TObjectIntCustomHashMap
(new HashingStrategy () 覆盖 equals() 和 hashCode() 我正在使用 byte[] 因为这就是我的数据! , byte[] 大小并不总是奇数