密码加载CSV渴望且动作持续时间长

Lio*_*erg 5 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
Run Code Online (Sandbox Code Playgroud)

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

UUID=fc21456b-afab-4ff0-9ead-fdb31c14151a /mnt/neodata            
ext4    defaults,noatime,barrier=0      1  2
Run Code Online (Sandbox Code Playgroud)

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

*                soft      memlock         unlimited
*                hard      memlock         unlimited
*                soft      nofile          40000
*                hard      nofile          40000
Run Code Online (Sandbox Code Playgroud)

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

session         required        pam_limits.so
Run Code Online (Sandbox Code Playgroud)

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

vm.dirty_background_ratio = 50
vm.dirty_ratio = 80
Run Code Online (Sandbox Code Playgroud)

通过运行以下命令禁用日志:

 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
Run Code Online (Sandbox Code Playgroud)

除此之外,在运行探查器时,我会遇到很多“渴望者”,而我真的不明白为什么:

 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                |                                                        |
+---------------+------+---------+---------------------+--------------------------------------------------------+
Run Code Online (Sandbox Code Playgroud)

所有标签和属性都有索引/约束谢谢Lior的帮助

Mic*_*ger 3

何利奥尔,

我们试图在这里解释一下预加载:

马克的原始博客文章在这里: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

尝试理解“热切操作”

我之前读过这一点,但直到 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 语句,不少用户也会遇到此问题。很多时候你可以避免它,但有时你却无法避免。”