摄入率慢

时间:2016-04-19 14:43:03

标签: neo4j

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

我们尝试过py2neo版本2和版本3以及Neo4J Enterprise版本2和3的组合。对于每种组合,摄取率保持大致相同。我们使用1000个摘要批量来提高性能。摘要平均大约400-500个单词,我们创建5个具有适度属性的附加实体,然后在每个摘要和实体之间创建关系。我们首先摄取实体,然后是关系(create_unique())以避免往返服务器(没有find()或find_one())。我们更喜欢使用merge()而不是create()来确保每个抽象只创建一个节点。我们尝试了create(),并且负载性能仅略有提升。瓶颈似乎在服务器端。我们的脚本将快速创建1000个事务,然后在提交期间有一个延迟的延迟,表明在处理事务时Neo4J服务器的任何减速都会出现。

我们需要一种不会擦除整个Neo4J数据库的解决方案。我们打算将来并行摄取多个数据流,这样数据库必须保持稳定。

我们更喜欢Python而不是Java,而不喜欢基于py2neo的基于合并()/ create()的交易而不是直接的Cypher查询。

我们希望博尔特会给我们更好的表现,但目前Bolt交易无限期地挂起了py2neo v3 / Neo4J 3.0.0 RC1。我们还挂了一个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

感谢。

2 个答案:

答案 0 :(得分:1)

如何通过neo4j-shell加载?我在R中完成了大部分工作,并简单地编写了导入脚本。

Here是一篇博客文章,其中概述了该方法。你可以用Python镜像它。

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

我发现这种方法在加载更大的数据集时很有用。但当然,这一切都取决于数据密度,数据模型本身以及建立适当的索引。

答案 1 :(得分:0)

此博客文章介绍了如何批量导入数据:

https://neo4j.com/blog/bulk-data-import-neo4j-3-0/

他们声称可以导入 ~31M节点,~3M左右〜78M关系

他们只是没有提到正在运行的机器,很可能是集群。

但是,它表明应该可以获得比你观察到的更高的摄取率。

当你真的想要批量插入时,Python类可能一次导入一条记录。

相关问题