Neo4j 摄食速度慢

Neo4j 摄食速度慢,neo4j,Neo4j,我们的py2neo脚本使用Neo4J以每天约500000的速度摄取摘要。为了进行比较,我们在Solr中一天摄取了2000万份这些摘要。我们想知道这是否是Neo4J的预期摄取率,或者我们是否可以做些什么来提高性能 我们尝试了py2neo版本2和版本3以及Neo4J企业版2和3的组合。在每种组合中,摄入率保持不变。我们使用1000份摘要来提高性能。摘要平均约400-500字,我们创建了另外5个具有适度属性的实体,然后在每个摘要和实体之间创建关系。我们首先摄取实体,然后再摄取关系(create_uni

我们的py2neo脚本使用Neo4J以每天约500000的速度摄取摘要。为了进行比较,我们在Solr中一天摄取了2000万份这些摘要。我们想知道这是否是Neo4J的预期摄取率,或者我们是否可以做些什么来提高性能

我们尝试了py2neo版本2和版本3以及Neo4J企业版2和3的组合。在每种组合中,摄入率保持不变。我们使用1000份摘要来提高性能。摘要平均约400-500字,我们创建了另外5个具有适度属性的实体,然后在每个摘要和实体之间创建关系。我们首先摄取实体,然后再摄取关系(create_unique()),以避免往返服务器(no find()或find_one())。我们更喜欢merge()而不是create(),以确保每个抽象只创建一个节点。我们确实尝试了create(),但加载性能只是略有提高。瓶颈似乎在服务器端。我们的脚本将快速创建1000个事务,然后在提交过程中会有一个较长的延迟,这表明在处理事务时,Neo4J服务器会出现任何减速

我们需要一个不会擦除整个Neo4J数据库的解决方案。我们打算在将来并行接收多个数据流,因此数据库必须保持稳定

我们更喜欢Python而不是Java,更喜欢py2neo的基于merge()/create()的事务而不是直接的Cypher查询

我们希望Bolt能给我们带来更好的性能,但目前py2neo v3/Neo4J 3.0.0 RC1的Bolt事务无限期挂起。我们还挂起了一个HTTP事务实例

我们的Neo4J实例使用默认配置

我们的服务器是一个2处理器、12核的Linux主机,内存为32GB

关于如何提高负载性能有什么建议吗?如果我们能在几天内将2000万篇摘要吸收到Neo4J中,那将是一件了不起的事情

我们的摄取脚本显示每秒54个实体事务的事务速率。请注意,这是54,而不是54K:

$ python3 neo-ingestion-rate.py
Number of batches: 8
Entity transactions per batch: 6144
Merge entities: 2016-04-22 16:31:50.599126
All entities committed: 2016-04-22 16:47:08.480335
Entity transactions per second: 53.5494121750082
Relationship transactions per batch: 5120
Merge unique relationships: 2016-04-22 16:47:08.480408
All relationships committed: 2016-04-22 16:49:38.102694
Number of transactions: 40960
Relationship transactions per second: 273.75593641599323

谢谢。

通过
neo4j外壳加载怎么样?我在R中完成了大部分工作,并简单地编写了导入脚本

这是一篇博客文章,我在其中概述了方法。您可以在Python中镜像它

基本思想是获取数据,将其保存到磁盘,然后通过
neo4jshell
加载,在那里执行引用这些文件的cypher脚本


我发现这种方法在加载更大的数据集时非常有用。当然,这完全取决于数据的密度、数据模型本身以及是否建立了适当的索引。

这篇博文解释了如何批量导入数据:

他们声称能够在3分钟内导入3100万个节点和7800万个关系

他们只是没有提到它运行的机器,很可能是一个集群

尽管如此,它还是显示出有可能获得比你观察到的更高的摄取率


Python类可能一次导入一条记录,而您确实希望执行批量插入。

如果不知道您的模式和脚本是什么样子,尤其是索引的使用情况,很难判断这一点。一般来说,使用cypher,我在笔记本电脑上每秒有6k个节点和27k个关系(都有3个属性)的写入吞吐量,因此在服务器使用py2neo
transaction=graph.begin()/node=node()/transaction.merge(node)/transaction.commit()之前,有很大的空间首先调查您的查询和脚本
。我们的模式是每个抽象6个节点,每个抽象与其他5个节点之间有关系。我们将尝试设置一个缓慢摄取率的演示,并将其发布到此处以帮助分析。不要告诉我您对6个节点执行了6次此操作,对吗?我们使用脚本更新了原始问题。你能找出一个会导致表现不佳的缺陷吗?谢谢你的建议。我们知道Neo4JShell,但我们更喜欢Python类。除了推动Neo4J,它还推动Elasticssearch。一种解决方案可能是保留Python类并对Neo4JShell进行系统调用。这并不理想,但如果这是提高性能的唯一方法,我们可能别无选择。