我需要将大约50亿个顶点加载到OrientDB中。
OrientDB文档声称,每个集群可以容纳超过90亿个顶点,一天可以插入多达100亿个文档。然而,我已经运行了几天,只创建了一小部分数据。
我的模型很简单。。。
Person
-> Name STRING
-> Score DECIMAL
1
我已经让OrientDB oetl工具运行,它在一周内插入了5亿条记录。记录仍然(非常缓慢)以每秒大约100行的速率加载。它开始时大约每秒1500个节点,但速度逐渐放缓。目前的估计建议在几个月内加载所有数据(!)
2
同时,我编写了一个单独的java应用程序来测试批量插入
final OrientGraphFactory factory = new OrientGraphFactory("plocal:C:/orientdb/databases/test", "X", "X");
factory.declareIntent(new OIntentMassiveInsert());
OrientGraphNoTx graph = factory.getNoTx();
for (int i= 0; i < NUM_INSERTLOOPS; i++)
{
OrientVertex v = graph.addVertex("person", "12");
v.setProperty("Name", "test" + i);
v.setProperty("Score", 100 * i);
}
graph.commit();
这也开始得很好,大约8秒内有10万个节点,但在1000万左右之后,这似乎突然慢到了5分钟以上。我在24小时和5000万个节点后停止了它。
我正在一台性能良好的Windows机器上运行一个本地数据库。运行任一进程时,CPU使用率约为1%。oetl使用了大约15B的20GB RAM,而java程序则要少得多。
这是意料之中的表现,还是我误解了什么。我很乐意等待几天来加载我的数据,但不是几周(/月!!)
对于NoTx中的java导入程序,要进行优化,可以使用具有类似内联属性的addVertex。
OrientVertex v = graph.addVertex("class:person", "Name","test" + i,"Score", 100 * i);
这将只调用一次save。
提高速度的下一步是使用多线程