即时通讯加载的文件有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的帮助
何利奥尔,
我们试图在这里解释一下预加载:
马克的原始博客文章在这里: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 语句,不少用户也会遇到此问题。很多时候你可以避免它,但有时你却无法避免。”