2015-11-11 2 views
1

Я испытываю очень медленный прием данных в OrientDB с помощью Java-интерфейса Blueprint. В частности, я загружаю ~ 1M-узлы и 3M-ребра из нескольких CSV-файлов, используя режим plocal и класс OrientGraphNoTx (к сожалению, я не мог использовать ETL, поскольку он не позволяет мне читать файл, содержащий ребра из существующих узлов). Код написан на Scala и работает примерно полтора часа.OrientDB: как ускорить импорт из Blueprint API Java?

Схема базы данных содержит 5 классов вершин, 7 краевых классов и 6 индексов. Атрибуты, которые я использую для создания ребер, индексируются с помощью unique_hash_index es. Создание ребер между существующими узлами было наиболее затратным временем (вероятно, потому, что существует много ребер), ниже - код, который я использовал. Кто-нибудь знает, как его оптимизировать?

/** 
* Adds edges to the graph. 
* Assumes edgesPath points to a CSV file with format (from, to) 
*/ 
def addEdges(edgesPath: String, 
      fromTable: String, fromAttribute: String, 
      toTable: String, toAttribute: String, 
      edgeType: String, graph: OrientGraphNoTx) { 

    logger.info(s"Adding edges from '$edgesPath'...") 
    val in = Files.newBufferedReader(Paths.get(edgesPath), Charset.forName("utf-8")) 
    val records = CSVFormat.DEFAULT 
    .withHeader("from", "to") 
    .withSkipHeaderRecord(hasHeader) 
    .parse(in) 
    var errors = 0 
    for (r <- records) { 
    val (src, target) = (r.get("from"), r.get("to")) 
    if (src != "" && target != "") { 
     try { 
     graph.command(new OCommandSQL(s"CREATE EDGE $edgeType FROM (" + 
      s"SELECT FROM $fromTable WHERE $fromAttribute = '$src') " + 
      s"TO (SELECT FROM $toTable WHERE $toAttribute ='$target')")).execute() 
     } catch { 
     case e: OCommandExecutionException => errors += 1 
     } 
    } //if 
    } //for 
    if(errors > 0) 
    logger.warn(s"Couldn't create $errors edges due to missing sources/targets or internal errors") 
    logger.info("done.") 
} //addEdges 

ответ

2

Если вы работаете в plocal и вам нужен один пакетный импорт попытаться отключить WAL для импортера

OGlobalConfiguration.USE_WAL.setValue(false); 
+0

спасибо за совет; он работает прямо сейчас. Я дам Вам знать. – Alberto

+0

К сожалению, на время исполнения было очень мало улучшения :( – Alberto

Смежные вопросы