Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java API与Python在Neo4J上的性能对比_Java_Python_Neo4j_Cypher - Fatal编程技术网

Java API与Python在Neo4J上的性能对比

Java API与Python在Neo4J上的性能对比,java,python,neo4j,cypher,Java,Python,Neo4j,Cypher,我正在使用一个使用Neo4J图的应用程序,该图包含大约1000万个节点。我每天运行的主要任务之一是将新的/更新的节点批量导入到图中,数量大约为100-200万。在将Python脚本与Cypher查询语言相结合进行实验之后,我决定尝试使用JavaAPI构建嵌入式图形,以获得更好的性能结果 我发现使用本机JavaAPI的性能提高了5倍。我正在使用Neo4j 2.1.4,我相信这是最新的。我在其他帖子中读到,嵌入式图形的速度要快一点,但这应该/可能在不久的将来发生变化。我想和任何观察到类似结果的人一起

我正在使用一个使用Neo4J图的应用程序,该图包含大约1000万个节点。我每天运行的主要任务之一是将新的/更新的节点批量导入到图中,数量大约为100-200万。在将Python脚本与Cypher查询语言相结合进行实验之后,我决定尝试使用JavaAPI构建嵌入式图形,以获得更好的性能结果

我发现使用本机JavaAPI的性能提高了5倍。我正在使用Neo4j 2.1.4,我相信这是最新的。我在其他帖子中读到,嵌入式图形的速度要快一点,但这应该/可能在不久的将来发生变化。我想和任何观察到类似结果的人一起验证我的发现

我在下面加入了一些代码片段,只是为了让大家对所使用的方法有一个大致的了解——代码已经大大简化了

来自cypher/python的示例:

cnode = self.graph_db.create(node(hash = obj.hash,
    name = obj.title,
    date_created = str(datetime.datetime.now()),
    date_updated = str(datetime.datetime.now())
))
使用java的嵌入式图形示例:

final Node n = Graph.graphDb.createNode();
for (final Label label : labels){
    n.addLabel(label);
}
for (Map.Entry<String, Object> entry : properties.entrySet()) {
    n.setProperty(entry.getKey(), entry.getValue());
}
final Node n=Graph.graphDb.createNode();
用于(最终标签:标签){
n、 添加标签(标签);
}
对于(Map.Entry:properties.entrySet()){
n、 setProperty(entry.getKey(),entry.getValue());
}

谢谢你的洞察力

如果没有适当的绩效衡量标准,很难判断时代的走向。一般来说,Python脚本比Java慢,但该语言编写代码的速度更快,因此您可以用开发速度换取执行速度

例如:上面的代码在Python中运行一小时,在Java中运行12分钟。编写Python版本需要1天,Java版本需要3天。这意味着您需要至少运行代码2天/(60-12)分钟=60次才能达到收支平衡


当然,这个示例只有在您能够等待48分钟让Python完成其工作时才有意义。如果您的系统在导入时处于停机状态,那么60分钟对12分钟将产生巨大的影响,除非您可以在无人关心的夜间运行它。

如果您使用Java与Python 3()玩“基准测试游戏”,Java版本的5倍改进当然是合理的。

您在这里实际做的是比较两种不同API的速度,并且仅使用两种不同的语言来实现这一点。因此,你不是在比较同类。Python(和其他语言)使用的Java核心API和REST API有不同的习惯用法,例如显式和隐式事务。此外,与RESTAPI相关联的网络延迟将产生巨大的差异,特别是当您为每个创建的节点使用一个HTTP调用时

因此,为了获得更有意义的性能比较,请确保您正在逐个比较:可能通过RESTAPI使用Java,或者对这两个测试都使用Cypher

提示1:通过将多个请求批处理到单个API调用中,通常会比REST获得更好的性能

提示2:RESTAPI永远不会像核心API那样快,因为后者是本机的,而且前者需要经历更多的层