【问题标题】:OrientDB slow insertOrientDB 慢速插入
【发布时间】:2015-04-07 09:28:09
【问题描述】:

我需要将大约 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 秒内有 100k 个节点,但在 1000 万左右之后,这似乎突然减慢到超过 5 分钟。我在 24 小时和 5000 万个节点后停止了它。

我正在一台配置良好的 Windows 机器上运行本地数据库。运行任一进程时,CPU 使用率约为 1%。 oetl 使用了大约 15B 的 20GB RAM,java 程序要少得多。

这是预期的表现还是我误解了什么。我很高兴等待几天来加载我的数据,但不是几周(/几个月!!)

【问题讨论】:

  • etl.json,在加载器中你设置了batchCommit?像this 这样的东西。也许会有所帮助。
  • 其实我没有设置了batchCommit,我昨天早上启动了一个新的etl导入,设置为1000。这似乎启动得更快,已经加载了1.5亿24 小时内的节点 - 感谢您的提示。然而,在大约 1 亿个节点之后,它又突然变慢了,我目前每秒大约有 10 个节点......

标签: java performance orientdb


【解决方案1】:

为了优化 NoTx 中的 java 导入器,您可以使用 addVertex 和这样的内联属性。

OrientVertex v = graph.addVertex("class:person", "Name","test" + i,"Score", 100 * i);

这只会调用一次保存。

提高速度的下一步,是使用多线程

【讨论】:

  • 内联属性帮助很大,(可以预见的)数据子集的时间减少了大约三分之一。实际上,我已经在进行多线程处理(通过简单的 ExecutorService),但在 OrientDB 中还有更多内容 - 我注意到有一个 Orient DatabasePoolFactory...
  • 如果你想尝试多线程,你应该设置这个属性 graph.getRawGraph().set(ODatabase.ATTRIBUTES.MINIMUMCLUSTERS,n) 其中 n 是你的线程数。
  • 我在这方面没有取得太大进展。按照目前的速度,插入我需要的 50 亿个顶点似乎还需要几周时间。
猜你喜欢
  • 2014-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-25
  • 1970-01-01
  • 2012-08-04
  • 2017-11-01
相关资源
最近更新 更多