首页 文章

Ignite使用的内存超出预期

提问于
浏览
3

我正在使用Ignite构建数据计算框架 . 一个大问题是内存使用量比预期多一点 . 使用Ignite外部1G内存的数据将在Ignite缓存中使用1.5G以上的数据 .

我已经关闭了备份和copyOnRead . 我不使用查询功能,因此没有额外的索引空间 . 我还计入了用于每个缓存和缓存条目的额外空间 . 总内存使用量仍然没有增加 .

每个缓存条目的数据值是包含基本数组列表的大映射 . 每个条目大约120MB .

可能是什么问题?数据结构还是配置?

2 回答

  • 1

    Ignite确实会给你的数据带来一些开销,而一半的GB也不会让我觉得太糟糕 . 我建议您参考本指南了解更多详情:https://apacheignite.readme.io/docs/capacity-planning

  • 0

    预期和实际内存使用之间的差异来自两个要点:

    • 每个条目都有不间断的开销,包括为 distributed computing environment 中的处理条目提供支持的对象 .

    例如 . 你可以声明整数局部变量,它在栈中需要4个字节,但是很难使变量长寿并且可以从程序的其他地方访问 . 所以你必须创建新的Integer对象,它至少消耗16个字节(300%的开销不是吗?) . 更进一步,如果你想让这个对象变得多变并且多个线程可以安全地执行,你必须创建新的AtomicReference并将你的对象存储在里面 . 总内存消耗至少为32个字节......依此类推 . 每次我们扩展对象功能时,我们都会获得额外的开销,没有别的办法 .

    • 每个条目以特殊的序列化格式存储在缓存中 . 因此,条目的实际内存占用量取决于使用的格式 . 默认情况下,Ignite使用BinaryMarshaller将对象转换为字节数组,此数组存储在BinaryObject中 .

    原因很简单,分布式计算系统不断地在节点之间交换条目,并且缓存中的每个条目都应该准备好作为字节数组传输 .

    请阅读article,它最近更新了 . 您可以手动估计小条目的条目开销,但对于大条目,您应该检查存储在缓存中的实际条目作为字节数组 . 看看withKeepBinary方法 .

相关问题