海量地图性能(java)

时间:2015-12-25 04:47:46

标签: java performance maps

我正在处理一个项目,该项目要求我(可能)存储(可能)数百万个键值映射,并且(可能)一次(可能)进行100次查询。我可以对我正在使用的数据进行一些检查,但它只会减少一点负荷。另外,我将(可能)放置/删除一秒钟,因此我的问题是:是否有足够的地图用于此任务?我有什么方法可以优化地图吗?有没有更快的东西可用于存储键值映射?

一些其他信息; - 关键是3d空间中的一个点,我觉得这意味着我可以使用数组,但数组必须是庞大的 - 值必须是对象

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

信封背面估计有助于与这类事情达成协议。如果地图中有数百万个条目,可以说是32M,一个密钥是3d点(所以3个整数 - > 3 * 4B-> 12个字节) - > 12B * 32M = 324MB。您没有提到值的大小,但假设您具有相似大小的值,则允许该值加倍。这是Java,所以假设64位平台具有默认的压缩OOP以及大多数人所使用的,你需要为每个对象额外支付12B的对象头。所以:32M * 2 * 24B = 1536MB。

现在,如果您使用HashMap,每个条目都需要额外的HashMap.Node,在上面的平台上的Java8中,您将看到每个节点32B(使用OpenJDK JOL查找对象大小)。这带给我们2560MB。还要花费HashMap数组的成本,你正在查看一个包含64M条目的表的32M条目(因为数组大小是2的幂,你需要一些超出你的条目的余量),所以这是额外的256MB。所有这些都可以让它达到3GB?

现在大多数服务器都有相当大的内存(10到100英镑),并且为JVM live set添加额外的3GB不应该吓到你。您可能会认为开销超过您案例中的数据令人失望,但这不是您的情绪健康,这是一个有效的问题; - )

现在您已经加载了数据,您正在以每秒100次插入/删除的速率进行变异,比方说1024,重复使用以上数量我们可以总结:1024 *(24 * 2 + 32)= 70KB。每秒搅拌70KB的垃圾对于许多应用程序来说是一个很小的变化,而不是你一定需要流汗的东西。将它置于上下文中,JVM将争取在几十毫秒的时间内收集100多个年轻一代的MB。

因此,总而言之,如果您只需要加载数据并按照您描述的方式对其进行查询/变异,您可能会发现现代服务器可以轻松地与vanilla解决方案竞争。我建议你给它一个去,可能是原型和一些有代表性的数据集,看看它是如何工作的。如果您遇到问题,可以随时找到更具异国情调/效率的解决方案。