Orientdb быстрый batchimport

Я пытаюсь найти самый быстрый способ импортировать ребра в OrientDB Graph из CSV. (Моя версия OrientDB 2.1.15.)

Теперь у меня есть граф с 100k вершинами и 1,5 M ребрами. Скоро я увеличу его размер до 100m вершин и 100B + ребер, и я не хочу ждать, пока импорт закончится в течение нескольких месяцев 🙂

Я пытался сделать это разными способами:

  1. По умолчанию JSON ETL. Скорость загрузки кромок составляет около 200-300 строк / сек. Очень медленно, работает около 1,5 ч. Попытался изменить режим » Tx » и другие свойства, он не сделал никаких изменений в производительности.

  2. Код Java с использованием класса BatchGraph. Я пробовал различные размеры буфера для транзакций здесь, лучшая производительность была достигнута с размером 10. Но все равно он работает медленно для меня: около 45m.

  3. Импорт специального формата JSON из консоли (команда IMPORT DATABASE). (Кстати, это не так хорошо, как предыдущие два для моей задачи.) Но это очень медленно слишком-около 1h.

Есть ли возможность импортировать такой граф (1,5 м ребер) в OrientDB за короткое время? Идеально подходит для меня: менее 1 минуты. Пожалуйста, скажите мне, могу ли я как-то улучшить свой код.

Мой json:

{
  "source": { "file": { "path": "/opt/orientdb/orientdb-community-2.1.15/bin/csv/1_1500k_edges.csv" } },
  "extractor": { "csv": {} },
  "transformers": [
    { "merge": { "joinFieldName": "ids", "lookup": "V.id" } },
    { "vertex": { "class": "V" } },
        { "edge": { "class": "Edges",
                "joinFieldName": "ide",
                "lookup": "V.id",
                "direction": "out",
                "edgeFields": { "val": "${input.val}" },
                "unresolvedLinkAction": "CREATE"} }
  ],
  "loader": {
    "orientdb": {
       "dbURL": "remote:localhost/graph",
       "dbType": "graph",
       "wal":false,
       "tx":true,
       "batchCommit":1000,
       "standardElementConstraints": false,
        "classes": [
         {"name": "V"},
         {"name": "Edges", "extends": "E"}
       ], "indexes": [
         {"class":"V", "fields":["id:integer"], "type":"UNIQUE" }
       ]
    }
  }
}

Java-код:

this.graph = new OrientGraph(this.host, this.name, this.pass);
this.graph.setStandardElementConstraints(false);
this.graph.declareIntent(new OIntentMassiveInsert());
BatchGraph<OrientGraph> bgraph = new BatchGraph<OrientGraph>(this.graph, VertexIDType.NUMBER, buff);
bgraph.setVertexIdKey("id");
<parsing strings from CSV in id[0], id[1] and val - edge property>:
  Vertex[] vertices = new Vertex[2];
  for (int i=0;i<2;i++) {
    vertices[i] = bgraph.getVertex(id[i]);
    if (vertices[i]==null) vertices[i]=bgraph.addVertex(id[i]);
  }
  Edge edge = bgraph.addEdge(null, vertices[0], vertices[1], "Edges");
  edge.setProperty("val", val);

1 ответ

  1. Я думаю, что единственный способ, которым вы должны сделать импорт в ~1 мин, это работать в plocal:

     this.graph = new OrientGraph("plocal:/physical/path/to/db/dir", this.name, this.pass);
    

    Если это одноразовый импорт, вы можете просто сделать это из программы java, если это повторяющаяся операция, и вам нужно, чтобы она выполнялась на автономном экземпляре, вы можете определить серверную функцию для этого и предоставить ее с помощью плагина

    http://orientdb.com/docs/2.0/orientdb.wiki/Extend-Server.html