Cypher加载CSV渴望和长动作持续时间

时间:2015-08-03 13:23:28

标签: neo4j cypher

即时加载85K行的文件--19M, 服务器有2个内核,14GB RAM,运行centos 7.1和oracle JDK 8 使用以下服务器配置可以 5-10分钟

dbms.pagecache.memory=8g                  
cypher_parser_version=2.0  
wrapper.java.initmemory=4096  
wrapper.java.maxmemory=4096

安装在/ etc / fstab中的磁盘:

UUID=fc21456b-afab-4ff0-9ead-fdb31c14151a /mnt/neodata            
ext4    defaults,noatime,barrier=0      1  2

将此添加到/etc/security/limits.conf:

*                soft      memlock         unlimited
*                hard      memlock         unlimited
*                soft      nofile          40000
*                hard      nofile          40000

将此添加到/etc/pam.d/su

session         required        pam_limits.so

将此添加到/etc/sysctl.conf:

vm.dirty_background_ratio = 50
vm.dirty_ratio = 80

通过运行禁用日记:

 sudo e2fsck /dev/sdc1
 sudo tune2fs /dev/sdc1
 sudo tune2fs -o journal_data_writeback /dev/sdc1
 sudo tune2fs -O ^has_journal /dev/sdc1
 sudo e2fsck -f /dev/sdc1
 sudo dumpe2fs /dev/sdc1

除此之外, 在运行一个分析器时,我得到了很多“Eagers”,我真的不明白为什么:

 PROFILE LOAD CSV WITH HEADERS FROM 'file:///home/csv10.csv' AS line
 FIELDTERMINATOR '|'
 WITH line limit 0
 MERGE (session :Session { wz_session:line.wz_session })
 MERGE (page :Page { page_key:line.domain+line.page }) 
   ON CREATE SET page.name=line.page, page.domain=line.domain, 
 page.protocol=line.protocol,page.file=line.file


Compiler CYPHER 2.3

Planner RULE

Runtime INTERPRETED

+---------------+------+---------+---------------------+--------------------------------------------------------+
| Operator      | Rows | DB Hits | Identifiers         | Other                                                  |
+---------------+------+---------+---------------------+--------------------------------------------------------+
| +EmptyResult  |    0 |       0 |                     |                                                        |
| |             +------+---------+---------------------+--------------------------------------------------------+
| +UpdateGraph  |    9 |       9 | line, page, session | MergeNode; Add(line.domain,line.page); :Page(page_key) |
| |             +------+---------+---------------------+--------------------------------------------------------+
| +Eager        |    9 |       0 | line, session       |                                                        |
| |             +------+---------+---------------------+--------------------------------------------------------+
| +UpdateGraph  |    9 |       9 | line, session       | MergeNode; line.wz_session; :Session(wz_session)       |
| |             +------+---------+---------------------+--------------------------------------------------------+
| +ColumnFilter |    9 |       0 | line                | keep columns line                                      |
| |             +------+---------+---------------------+--------------------------------------------------------+
| +Filter       |    9 |       0 | anon[181], line     | anon[181]                                              |
| |             +------+---------+---------------------+--------------------------------------------------------+
| +Extract      |    9 |       0 | anon[181], line     | anon[181]                                              |
| |             +------+---------+---------------------+--------------------------------------------------------+
| +LoadCSV      |    9 |       0 | line                |                                                        |
+---------------+------+---------+---------------------+--------------------------------------------------------+

所有标签和属性都有索引/约束 谢谢您的帮助 利奥尔

1 个答案:

答案 0 :(得分:3)

He Lior,

我们试图在这里解释Eager Loading:

Marks的原创博文在这里:http://www.markhneedham.com/blog/2014/10/23/neo4j-cypher-avoiding-the-eager/

Rik试图用更简单的术语解释它:

http://blog.bruggen.com/2015/07/loading-belgian-corporate-registry-into_20.html

试图理解" Eager Operation"

我之前已经读过这个,但是直到Andres再次向我解释之后才真正理解它:在所有正常操作中,Cypher懒洋洋地加载数据。请参阅手册中的此页面 - 它基本上只是在执行操作时尽可能少地加载到内存中。这种懒惰通常是一件非常好的事情。但它也会给你带来很多麻烦 - 正如迈克尔向我解释的那样:

  

" Cypher试图履行不同业务的合同   在声明中不会相互影响。否则你可能会   非确定性行为或无限循环。想象一下   声明如下:
  MATCH (n:Foo) WHERE n.value > 100 CREATE (m:Foo {m.value = n.value + 100});

     

如果这两个陈述不会   隔离,然后CREATE生成的每个节点都会导致MATCH   再次匹配等无限循环。这就是为什么在这种情况下,Cypher   急切地将所有MATCH语句运行到用尽所有   中间结果被累积并保存(在内存中)。

     

一般   大多数操作都不是问题,因为我们大多只匹配少数几个   最多十万元素

     

使用LOAD CSV进行数据导入,   但是,此操作将拉入CSV的所有行(其中   可能是数百万),急切地执行所有操作(可能是   数百万创建/合并/匹配)并保持中间   结果在内存中提供下一行操作。

     

这也是   有效地禁用PERIODIC COMMIT,因为当我们到达结束时   语句执行所有创建操作都已经有了   发生了,巨大的tx状态已经累积。"

这就是我的加载csv查询的内容。 MATCH / MERGE / CREATE导致将急切的管道添加到执行计划中,并且它有效地禁用了我的操作的批处理"使用定期提交"。显然,即使看似简单的LOAD CSV语句,也有不少用户遇到此问题。通常你可以避免它,但有时你不能。"