与JAVA异步运行gremlin查询时出现OOM错误

问题描述

我们创建了一个rest API,该API在Janus图上执行gremlin查询,并以JSON格式返回结果。 API工作文件用于较小的结果集。但是对于大型结果集,当我们异步访问API时,会产生以下错误,(最大堆大小using Testing.Pipelines; using Microsoft.VisualStudio.TestTools.UnitTesting; using System; namespace _Test { /// <summary> ///This is a test class for Test_ppr_Testing and is intended ///to contain all Test_ppr_Testing Unit Tests ///</summary> [TestClass()] public class Test_ppr_Testing { private TestContext testContextInstance; /// <summary> ///Gets or sets the test context which provides ///information about and functionality for the current test run. ///</summary> public TestContext TestContext { get { return testContextInstance; } set { testContextInstance = value; } } /// <summary> ///A test for ppr_Testing Constructor ///</summary> [TestMethod()] public void Test_ppr_TestingConstructor() { ppr_Testing target = new ppr_Testing(); var lDocuments = new System.Collections.Specialized.StringCollection(); lDocuments.Add(@"C:\MyTestDirectory\SomeFile.xml"); var lParts = new System.Collections.Specialized.StringCollection(); var lSchemas = new System.Collections.Generic.Dictionary<string,string>(); try { target.TestPipeline(lDocuments,lParts,lSchemas); var lTmp = this.TestContext; } catch (Exception ex) { Assert.Fail(ex.ToString()); } } } }

java.lang.OutOfMemoryError:超出了GC开销限制

我正在使用带有-Xmx4g的curl来异步访问API,

&

连接到janus图的代码

curl --location --request GET 'http://HOST:PORT/graph/search?gremlin=query &
curl --location --request GET 'http://HOST:PORT/graph/search?gremlin=query &
curl --location --request GET 'http://HOST:PORT/graph/search?gremlin=query &
curl --location --request GET 'http://HOST:PORT/graph/search?gremlin=query &

配置

cluster = Cluster.open(config);
connect = cluster.connect();

submit = connect.submit(gremlin);
Iterator<Result> resultIterator = submit.iterator();
int count=0;
while (resultIterator.hasNext()){
    //add to list,commented to check OOM error
}

克里姆林宫驱动程序,

config.setProperty("connectionPool.maxContentLength","50000000");
config.setProperty("connectionPool.maxInProcessperConnection","30");
config.setProperty("connectionPool.maxInProcessperConnection","30");
config.setProperty("connectionPool.maxSize","30");
config.setProperty("connectionPool.minSize","1");
config.setProperty("connectionPool.resultIterationBatchSize","200");

如何像游标一样处理大型结果集,以使并非所有数据都加载到内存中?
我缺少任何配置吗?非常感谢您的帮助。

克里姆林宫查询

org.apache.tinkerpop.gremlin-driver:3.4.6

性能分析来看,很显然gremlin驱动程序是造成此问题的原因,但我不确定如何解决它并释放内存。

enter image description here

另外,线程进入冻结状态超过5分钟,

enter image description here

解决方法

我认为您很可能遇到了这个问题TINKERPOP-2424。基本上,保存传入结果的队列的填充速度快于可以消耗结果并破坏堆的速度。您可以看到那里有一个补丁似乎可以解决问题,但是我不相信这是最好的解决方案,因此尚未实施。如果您有解决问题的建议,请随时在票证上发表评论。如果这不是您面临的问题,我认为您必须提供一种方法来复制您的问题或进行一些分析以进一步隔离问题。无论如何,最好进行一些概要分析,因为这样您就可以证明TINKERPOP-2424是您的问题。如果您看一下该帖子中的mailing list link,应该会看到验证问题的方法。