java - 在 Java 中检索大对象的选择属性集合的一种更好的执行方式

标签 java performance collections guava

有没有一种方法可以让我迭代一个集合并只检索属性的一个子集而不加载/卸载每个要缓存的完整对象?因为当我只需要一些属性时加载/卸载整个(可能是大的)对象似乎是一种浪费,尤其是在对象很大的情况下。加载这些不必要的数据时可能会导致不必要的缓存冲突,对吧?

当我想“加载到缓存”时,我的意思是通过处理器“处理”该对象。所以会有 ex: 10 个属性的对象。在迭代循环中,我只使用其中的一个。在这样的场景下,我认为把其他9个属性全部从内存加载到处理器是一种浪费。有没有只提取属性而不加载完整对象的解决方案?

此外,Google 的 Guava 之类的东西是否在内部解决了这个问题?

谢谢!

最佳答案

它通常不是第一个要查看的地方,但您遇到缓存共享问题也不是不可能。如果您真的确信(通过实际分析或硬件计数器分析)这是一个值得解决的瓶颈,您可能会考虑更改数据结构以使用并行原语数组(类似于某些数据库架构中基于列的数据库存储) .例如一个“列”作为 float[],另一个作为 short[],第三个作为 String[],全部由相同的标识符。此结构允许您“查询”各个列,而无需将当前不需要的任何列加载到缓存中。

我有一些低级算法代码,它们可以真正受益于 C 的 struct。我对各种替代方案进行了一些微基准测试,发现并行数组是我的算法最有效的选择(可能适用也可能不适用于您自己的算法)。

请注意,与在 java.util 集合中使用对象相比,并行数组结构的维护和变更要复杂得多。所以我要重申 - 只有在您确信 yield 是值得付出痛苦之后,我才会采用这种方法。

关于java - 在 Java 中检索大对象的选择属性集合的一种更好的执行方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14936120/

相关文章:

java - 集合 emptyList/singleton/singletonList/List/Set toArray

java - 将日期字符串解析为 "yyyy-MM-dd' T'HH :mm:ss' -'hh:mm" 时,小时、分钟和米尔值错误

java - Spring Security 登录身份验证中表单 post 方法不会返回到 Controller

Three.js 中数千行的性能问题

wpf - 我应该在 App.xaml 中声明转换器还是作为每个文件的资源?

performance - ActiveMQ 5.10/QPid 0.28/AMQP 1.0性能问题

c# - 从哈希表中读取匹配的记录到类对象中

java - 如果我遍历一个实际上是 java 列表的集合,集合会有顺序吗?

java - MySQL 设置变量并在同一语句/脚本中运行查询

Java:CardLayout在卡片之间切换