我正在使用Ignite构建数据计算框架 . 一个大问题是内存使用量比预期多一点 . 使用Ignite外部1G内存的数据将在Ignite缓存中使用1.5G以上的数据 .
我已经关闭了备份和copyOnRead . 我不使用查询功能,因此没有额外的索引空间 . 我还计入了用于每个缓存和缓存条目的额外空间 . 总内存使用量仍然没有增加 .
每个缓存条目的数据值是包含基本数组列表的大映射 . 每个条目大约120MB .
可能是什么问题?数据结构还是配置?
Ignite确实会给你的数据带来一些开销,而一半的GB也不会让我觉得太糟糕 . 我建议您参考本指南了解更多详情:https://apacheignite.readme.io/docs/capacity-planning
预期和实际内存使用之间的差异来自两个要点:
例如 . 你可以声明整数局部变量,它在栈中需要4个字节,但是很难使变量长寿并且可以从程序的其他地方访问 . 所以你必须创建新的Integer对象,它至少消耗16个字节(300%的开销不是吗?) . 更进一步,如果你想让这个对象变得多变并且多个线程可以安全地执行,你必须创建新的AtomicReference并将你的对象存储在里面 . 总内存消耗至少为32个字节......依此类推 . 每次我们扩展对象功能时,我们都会获得额外的开销,没有别的办法 .
原因很简单,分布式计算系统不断地在节点之间交换条目,并且缓存中的每个条目都应该准备好作为字节数组传输 .
请阅读article,它最近更新了 . 您可以手动估计小条目的条目开销,但对于大条目,您应该检查存储在缓存中的实际条目作为字节数组 . 看看withKeepBinary方法 .
2 回答
Ignite确实会给你的数据带来一些开销,而一半的GB也不会让我觉得太糟糕 . 我建议您参考本指南了解更多详情:https://apacheignite.readme.io/docs/capacity-planning
预期和实际内存使用之间的差异来自两个要点:
例如 . 你可以声明整数局部变量,它在栈中需要4个字节,但是很难使变量长寿并且可以从程序的其他地方访问 . 所以你必须创建新的Integer对象,它至少消耗16个字节(300%的开销不是吗?) . 更进一步,如果你想让这个对象变得多变并且多个线程可以安全地执行,你必须创建新的AtomicReference并将你的对象存储在里面 . 总内存消耗至少为32个字节......依此类推 . 每次我们扩展对象功能时,我们都会获得额外的开销,没有别的办法 .
原因很简单,分布式计算系统不断地在节点之间交换条目,并且缓存中的每个条目都应该准备好作为字节数组传输 .
请阅读article,它最近更新了 . 您可以手动估计小条目的条目开销,但对于大条目,您应该检查存储在缓存中的实际条目作为字节数组 . 看看withKeepBinary方法 .