如何使用以字节数组为键的多哈希映射的trove?

时间:2016-08-25 13:14:01

标签: java guava trove4j bigdata

目前我正在使用Guave的ArrayListMultiMap处理超过100,000件商品。地图的关键是byte array,值为long

现在我想减少开销。

我的想法是只使用原始集合和trove的散列图。所以最后每个键(字节数组)指向一个原始集合(原始长集)。

我的问题是如何在THashmap中使用字节数组作为键。在Guave中,我将字节数组包装在一个类中,但这会产生开销。

谢谢

2 个答案:

答案 0 :(得分:3)

您应该使用TCustomHashMap作为外部地图,因为您需要为byte[]提出哈希策略(实际上,只有一个调用Arrays.hashCode(byte[])会很好)

在外部地图中,使用TLongHashSet(或其他)来表示值,并且您已完成设置。

答案 1 :(得分:2)

您可以直接使用byte array作为密钥(无需包装等):

Map<byte[], TLongSet> map = new THashMap<>();
map.put(new byte[]{-0x80, 0x7F}, new TLongHashSet(new long[]{0xFFFFFFFF, 0x7FFFFFFF}));
System.out.println(map);

示例输出:

{[B@4d7e1886={2147483647,-1}}

编辑:

如果您不想要基于身份的密钥,则可以使用TByteArrayList代替byte[]。在我的机器上,每个实例的开销为25个字节。如果您的100,000个项目/长项中的每一个都存储在其自己的TLongSet中,每个项目都映射到唯一的byte array,那么这将产生2.5兆字节(25字节x 100,000)的开销。对于我来说,这似乎是一种更糟糕的情况,但是如果你确实想要避免这种情况,那么Rob Eden answer TCustomHashMap似乎还有一段路要走。< / p>