为什么在使用 TinkerPop 时会出现 OutOfMemoryException?

Why do I get a OutOfMemoryException when using TinkerPop?

我有一个 XML- 文件,其中包含 1 个 Mio 顶点和边。我想将它们加载到 Gremlin 服务器中,但是在大约 200.000 个节点之后,我在 Gremlin 服务器中得到了 OUTOfMemoryException。
我尝试了两种不同的方式

GraphTraversal<Vertex, Vertex> verttmp = g.addV(mapprop.get(LABEL)).property(T.id, keyid);
verttmp.next();

和一个客户

client.submit(query);

有没有安全的方法来处理这么多节点?

我假设您在 Gremlin 服务器中得到了这个 OutOfMemoryException。默认情况下,Gremlin 服务器配置了一个 -Xmx4096m,这可能不足以满足您正在加载的图的大小(尤其是当您使用纯内存图 TinkerGraph 时)。您只需要增加 gremlin-server.sh file-Xmx 的大小,直到您有足够的内存来保存您的图表。也许从加倍到 8192m 开始,但鉴于您只完成了 20% 的负载,我想知道加倍是否足够。

作为旁注,如果您要丢弃 verttmp.next() 的值(即在您的示例代码中,它看起来像您)那么最好这样做:

g.addV(mapprop.get(LABEL)).property(T.id, keyid).iterate()

这会便宜很多,因为您不会浪费时间返回任何必须序列化并通过网络发送的结果。此外,如果您正在提交脚本(即 "query" 是 String),那么我可以看出您不是 parameterizing your requests。这是一个性能杀手,我可以想象内存需求比需要的要高得多,因此 OutOfMemoryException 的提升比它应该的要早得多。修改您的代码以使用参数或使用远程遍历简单地创建基于字节码的请求:

GraphTraversalSource g = traversal().withRemote(DriverRemoteConnection.using("localhost",8182,"g"));

我建议您采用字节码方法,这样您就不必进行参数化,并且让您将 Gremlin 编写为代码而不是嵌入式字符串。