私の目標は、約 50M の頂点を持つグラフに 25M のエッジをインポートすることです。目標時間:
インポートの現在の速度は ~150 エッジ/秒です。リモート接続の速度は約 100 エッジ/秒でした。
- 抽出された 20,694,336 行 (171 行/秒) - 20,694,336 行 -> ロードされた 20,691,830 頂点 (171 頂点/秒) 合計時間: 35989762ms [警告 0、エラー 4]
- 抽出された 20,694,558 行 (156 行/秒) - 20,694,558 行 -> ロードされた 20,692,053 頂点 (156 頂点/秒) 合計時間: 35991185ms [警告 0、エラー 4]
- 抽出された 20,694,745 行 (147 行/秒) - 20,694,746 行 -> ロードされた 20,692,240 頂点 (147 頂点/秒) 合計時間: 35992453ms [警告 0、エラー 4]
- 抽出された 20,694,973 行 (163 行/秒) - 20,694,973 行 -> ロードされた 20,692,467 頂点 (162 頂点/秒) 合計時間: 35993851ms [警告 0、エラー 4]
- 抽出された 20,695,179 行 (145 行/秒) - 20,695,179 行 -> ロードされた 20,692,673 頂点 (145 頂点/秒) 合計時間: 35995262ms [警告 0、エラー 4]
etl config で並列を有効にしようとしましたが、Orient 2.2.12 で完全に壊れているように見え (2.1 のマルチスレッド変更との矛盾?)、上記のログに 4 つのエラーしか表示されません。ダム並列モード (2 つ以上の ETL プロセスを実行) も、plocal 接続では不可能です。
私の設定:
{
"config": {
"log": "info",
"parallel": true
},
"source": {
"input": {}
},
"extractor": {
"row": {
"multiLine": false
}
},
"transformers": [
{
"code": {
"language": "Javascript",
"code": "(new com.orientechnologies.orient.core.record.impl.ODocument()).fromJSON(input);"
}
},
{
"merge": {
"joinFieldName": "_ref",
"lookup": "Company._ref"
}
},
{
"vertex": {
"class": "Company",
"skipDuplicates": true
}
},
{
"edge": {
"joinFieldName": "with_id",
"lookup": "Person._ref",
"direction": "in",
"class": "Stakeholder",
"edgeFields": {
"_ref": "${input._ref}",
"value_of_share": "${input.value_of_share}"
},
"skipDuplicates": true,
"unresolvedLinkAction": "ERROR"
}
},
{
"field": {
"fieldNames": [
"with_id",
"with_to",
"_type",
"value_of_share"
],
"operation": "remove"
}
}
],
"loader": {
"orientdb": {
"dbURL": "plocal:/mnt/disks/orientdb/orientdb-2.2.12/databases/df",
"dbUser": "admin",
"dbPassword": "admin",
"dbAutoDropIfExists": false,
"dbAutoCreate": false,
"standardElementConstraints": false,
"tx": false,
"wal": false,
"batchCommit": 1000,
"dbType": "graph",
"classes": [
{
"name": "Company",
"extends": "V"
},
{
"name": "Person",
"extends": "V"
},
{
"name": "Stakeholder",
"extends": "E"
}
]
}
}
}
データサンプル:
{"_ref":"1072308006473","with_to":"person","with_id":"010703814320","_type":"is.stakeholder","value_of_share":10000.0} {"_ref":"1075837000095", "with_to":"person","with_id":"583600656732","_type":"is.stakeholder","value_of_share":15925.0} {"_ref":"1075837000095","with_to":"person"," with_id":"583600851010","_type":"is.stakeholder","value_of_share":33150.0}
サーバーの仕様は、Google Cloud 上のインスタンス、PD-SSD、6CPU、18GB RAM です。
ところで、同じサーバー上で、リモート接続を使用して頂点をインポートする際に約 3k/秒を得ることができました (それでも遅すぎますが、現在のデータセットでは許容範囲内です)。
そして質問: 1 秒あたり 10,000 回の挿入、または少なくとも 5,000 回のインポート速度を上げるための信頼できる方法はありますか? インデックスをオフにしたくありません。数十億ではなく数百万のレコードです。
アップデート
数時間後、パフォーマンスが低下し続けます。
- 抽出された 23,146,912 行 (56 行/秒) - 23,146,912 行 -> ロードされた 23,144,406 頂点 (56 頂点/秒) 合計時間: 60886967ms [警告 0、エラー 4]
- 抽出された 23,146,981 行 (69 行/秒) - 23,146,981 行 -> ロードされた 23,144,475 頂点 (69 頂点/秒) 合計時間: 60887967ms [警告 0、エラー 4]
- 抽出された 23,147,075 行 (39 行/秒) - 23,147,075 行 -> ロードされた 23,144,570 頂点 (39 頂点/秒) 合計時間: 60890356ms [警告 0、エラー 4]