繁体   English   中英

如何优化大内存的内存使用?

[英]how to optimize memory usage for a big memory?

我在Java中有一个很大的HashMap,用于存储从String到Integer的映射。 它有40万条记录。 它运行正常,但我想知道是否在内存使用方面有更好的优化方法。 初始化地图后,将仅对其进行搜索,而不会进行其他更新操作。

我隐约记得我曾遇到过一些建议,将字符串键转换为int,但不确定。 请帮助或分享您的想法。

谢谢。

我隐约记得我曾遇到过一些建议,将字符串键转换为int,但不确定。

如果字符串键实际上是整数的字符串表示形式,则可以使用Integer.valueOf(String)将它们转换为IntegerLong对象。 您将节省一些内存,因为原始包装器类使用的内存少于相应的String对象。 节省的空间可能很大(取决于每个平台,每个键大约16字节对40字节...)

不利的一面是,您需要在进行哈希图查找之前将候选键从String转换为真实键类型。 这种转换需要一些时间,并且通常会产生一些垃圾。


但是,如果String键不代表整数,那么这根本行不通。 (或者至少……我不知道您指的是什么“转换”……)

还要注意,键类型必须是Integer / Long而不是int / long 通用类型参数必须是引用类型。


可能会有第三方收集实现也将有所帮助……具体取决于您的数据结构是否有效; 例如Trove,Guava,Fastutil。 然后尝试结合使用String-> Integer preconversion ...


关于使用数据库的建议。 如果

  • 您不需要数据库的查询/更新/事务功能,并且
  • 您可以负担得起的内存将数据保存在内存中,并且
  • 您可以负担将数据加载到内存中的启动成本,

那么使用数据库只是每次查询时不必要的巨大性能损失。

您可能希望调整initialCapacityloadFactor还要改善hashCode()以避免冲突,如果您想以更高的速率进行读取,如果您有太多的写入,则可能希望对hashCode()进行基准测试,

即使对于您的应用程序来说太大了,您也可能要考虑将它移出jvm到某些缓存( redis ),或者如果可以承受较小的读/写延迟,则可能是数据库

如果数据太大,将数据写入数据库最终将是最好的解决方案,但是在内存中仍然可以实现400k。

但是,Java的内置HashMap实现使用单独的链接,每个键值对都有单独的类。 通过构建Map的二次探测实现,我已经获得了很大的速度提升(30%)和显着的内存改善(50%)。

我建议您在互联网上搜索。 周围有很多好的实现!

您可以使用Guava的 ImmutableMap针对一次写入数据进行了优化,并且HashMap节省约15%的内存

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM