out-of-memory - 带有高度顶点的 JanusGraph OOM 异常
问题描述
这是一个关于在java.lang.OutOfMemoryError: GC overhead limit exceeded
对 JanusGraph 执行操作时观察到的问题的问题。
设置
我正在运行0.2.0
以 Cassandra 作为底层存储的 JanusGraph 版本。我正在使用此处描述的默认配置值,但将我的存储后端描述为cql
存储主机的配置除外。
我在图表中插入了大量用户 - 每个用户都有 (1) 一封电子邮件,(2) 一个用户 ID,以及 (3) 一个关联的分组标签。对于这种情况,所有用户都在同一个分组中,我们称之为groupA
. 插入是按顺序完成的,每个插入在前一个完成后立即执行。
在每次插入操作期间,我创建一个代表电子邮件的顶点,一个代表用户 ID 的顶点,然后创建或更新代表groupA
. 我在 (1) 电子邮件 <-> 用户 ID 顶点和 (2) 用户 ID <-> 顶点之间创建一条边groupA
。
观察到的问题
我使用分析器来观察过程中的堆空间使用情况。插入在开始时运行没有问题,但随着更多的插入,使用的堆空间增加。最终,随着更多内存的使用,我在运行几个小时后遇到了内存不足的异常。
--
然后我第二次重复插入,但这次我没有包括groupA
顶点。这一次,内存使用随着时间的推移呈现出标准的锯齿模式,如下所示。
这使我得出结论,我观察到的内存不足问题是由于涉及这个高度groupA
顶点的操作。
潜在线索
我目前怀疑 JanusGraph 上有一些缓存过程,用于存储最近访问的元素。由于高度组顶点的邻接列表很大,因此可能会缓存大量数据,这只会随着我从组顶点到用户 ID 顶点创建越来越多的边而增加。
使用我的分析器,我注意到org.janusgraph.graphdb.relations.RelationCache
该类的内存使用量相对较高,因此这似乎是相关的。
我的问题
我的问题是:随着时间的推移,JanusGraph 的内存使用率越来越高的原因是什么?
解决方案
考虑频繁提交。当您插入数据时,它们会保存在事务缓存中,直到事务提交。另外,请查看您的数据库缓存配置。您将在此处找到有关缓存的更多信息。
推荐阅读
- python - 关于理解 Pytorch .named_modules() 循环的问题
- typescript - 如何在 Vue3 中使用 typescript 注册子组件
- c# - 同一主键ApplicationUser表上的EF多个外键关系
- php - 在供应商 vscode 中找不到函数的定义
- python - 扩展 Google 的 HelloAnalytics Python 脚本以提取 csv 中的数据
- java - 这两个代码块有什么区别?
- npm - 下划线 npm 包上的任意代码执行错误
- python - 在 anaconda 中安装 tensorflow-datasets 时;包将被更高优先级的频道取代:
- node.js - Web 开发新手不知道如何修复 reactjs 错误
- phpstorm - 如何在 PhpStorm 2020 中保留和运行一些命令?