Я испытываю очень медленный прием данных в 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
спасибо за совет; он работает прямо сейчас. Я дам Вам знать. – Alberto
К сожалению, на время исполнения было очень мало улучшения :( – Alberto