将 GraphML 导入 OrientDB 时出现 OutOfMemoryError

OutOfMemoryError when importing GraphML into OrientDB

我在 OrientDB 中导入一个中等大小的 GraphML 文件(大约 8GB),但我不断收到以下错误:

Importing GRAPHML database from database /root/neo/out.graphml...
Error: java.lang.OutOfMemoryError: GC overhead limit exceeded

我已尝试连接到我的本地数据库或作为远程数据库 (remote:localhost) 无济于事。公平地说,远程连接有帮助但还不够。我还尝试为控制台应用程序和数据库服务器本身调整堆大小(最大为 2048)。这也有帮助,但还不够,我不清楚到底是哪一个帮助了。

我想知道导入过程的哪一部分在这里需要这么多堆内存,因为 OrientDB 本身不使用堆内存进行数据库操作。哪个代理(加载 graphml 的控制台或保存导入结果的数据库)在这里需要更多堆内存,在这种情况下,将内存分配给 java 堆的最佳方式是什么?最后:与远程连接到同一台机器上的同一本地数据库(远程:本地主机)相比,当我在本地连接到数据库时,内存分配需求是否有所不同?

经过一天的试错,我成功了。这是我尝试和工作的方法:

OrientDB 的控制台将在将其导入数据库之前将整个 GraphML 文件加载到 Java 堆内存中。它需要的最大堆大小至少与您的 GraphML 文件一样大。解决方案是在 $orientdb/bin/console.sh 中设置控制台的最大堆大小。在我的例子中,这意味着将 JAVA_OPTS="-Xmx8192m" 添加到脚本的第 43 行。

OrientDB 的控制台不支持并行处理。尽管数据库操作主要受 IO 限制,但这在导入图形数据时被证明是一个限制因素。解决方案是在使用控制台时远程连接到 OrientDB,而不是本地连接。具体来说,您可能需要 运行 以下命令而不是建议的 create database plocal:/tmp/db/testcreate database remote:localhost/test USERNAME PASSWORD plocal

导入全部 7 GB 的数据(超过 400 万个顶点和超过 3700 万条边)用了 48 多个小时。顶点的导入速度非常快,而边的导入速度约为每秒 1000 条记录(8 核,SSD)。

Here写了整个过程

正如 orientdb documentation 所建议的那样,您可以使用 batchSize 参数来减少要处理的批处理大小。默认情况下它是 1000。所以你可以尝试像

控制台

orientdb {db=test}> IMPORT DATABASE /tmp/out.graphml batchSize=100

JAVA Api

new OGraphMLReader(new OrientGraph("plocal:/temp/bettergraph")).setBatchSize(100).inputGraph("/temp/neo4j.graphml");