通过使用Blueprint Java API,我在OrientDB中遇到了非常慢的数据摄取。
具体来说,我使用plocal
模式和OrientGraphNoTx
类从几个CSV文件加载〜1M节点和3M边缘(遗憾的是我不能使用ETL,因为它不允许我读取包含现有节点之间边缘的文件。
代码用Scala编写,运行大约一个半小时。
数据库的模式包含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
答案 0 :(得分:2)
如果您正在使用plocal,则需要一次批量导入 尝试禁用导入器的WAL
OGlobalConfiguration.USE_WAL.setValue(false);