我在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堆分配内存的最佳方法是什么?最后:当我连接到本地数据库时,与远程连接到同一台机器上的同一本地数据库(远程:localhost)相比,内存分配需求是否存在差异?
答案 0 :(得分:1)
经过一天的反复试验后,我做到了。这是我尝试和工作的内容:
OrientDB的控制台会将整个GraphML文件加载到Java堆内存中,然后再将其导入数据库。它需要的最大堆大小至少与GraphML文件一样大。解决方案是在$orientdb/bin/console.sh
中设置控制台的最大堆大小。在我的情况下,这意味着将JAVA_OPTS="-Xmx8192m"
添加到脚本的第43行。
OrientDB的控制台不适合并行处理。虽然数据库操作主要是IO绑定的,但这在导入图形数据时会成为一个限制因素。解决方案是在使用控制台时远程连接到OrientDB而不是本机连接。换句话说,您可能希望运行以下命令而不是建议的create database plocal:/tmp/db/test
:create database remote:localhost/test USERNAME PASSWORD plocal
。
导入整个7千兆字节的数据(超过400万个顶点和超过3700万个边缘)花了48个多小时。顶点导入速度非常快,边缘导入速度约为每秒1000条记录(8核,SSD)。
Here是对整个过程的记录。
答案 1 :(得分:0)
正如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");