如何打印日志和测量执行时间

Posted

技术标签:

【中文标题】如何打印日志和测量执行时间【英文标题】:how to print logs and measure execution time 【发布时间】:2020-03-16 08:48:02 【问题描述】:

目前,我正在尝试导入一个包含大约 200 万行的 CSV 文件。每条线对应一个节点。我正在使用 neo4j 浏览器。注意:我也试过neo4j import tool,但它的工作速度也慢了一些。

我尝试使用标准密码查询来运行脚本,例如

USING PERIODIC COMMIT 500 LOAD CSV FROM 'file:///data.csv' AS r 
WITH toInteger(r[0]) AS ID, toInteger(r[1]) AS national_id, toInteger(r[2]) as passport_no, toInteger(r[3]) as status, toInteger(r[4]) as activation_date 
MERGE (p:Customer ID: ID) SET p.national_id = national_id, p.passport_no = passport_no, p.status = status, p.activation_date = activation_date

这工作很慢。

后来我试过了。

CALL apoc.periodic.iterate('CALL apoc.load.csv(\'file:/data.csv\') yield list as r return r','WITH toInteger(r[0]) AS ID, toInteger(r[1]) AS national_id, toInteger(r[2]) as passport_no, toInteger(r[3]) as status, toInteger(r[4]) as activation_date MERGE (p:Customer ID: ID) SET p.national_id = national_id, p.passport_no = passport_no, p.status = status, p.activation_date = activation_date',
batchSize:10000, iterateList:true, parallel:true);

因为parallel 选项是true,所以这个似乎工作得更快。 但是我想测量一批的执行时间。

如何在 neo4j 浏览器上打印内容?

我如何测量一批的执行时间?

【问题讨论】:

【参考方案1】:

    您的第一个查询使用 500 的批处理大小,而您的第二个查询使用大 20 倍的批处理大小。您需要使用相同的批量大小进行有效比较。

    由于您的查询需要大量批次(至少 200 个),因此将总时间除以批次数应该是每批次平均时间的合理近似值。

    您是否在:Customer(ID) 上创建了index?这应该有助于加快查询速度。

    您应该考虑是否应将ON CREATE 表达式与MERGE 子句一起使用。现在,SET 子句总是被执行,即使节点已经存在。

【讨论】:

索引如何帮助我?我认为它们仅在搜索查询期间有所帮助。数据生成后不需要创建索引吗? 另外,您发送的索引链接说索引“......额外存储空间的成本和更慢的写入,......” 我刚刚在这里发现了另一件事neo4j.com/docs/getting-started/current/cypher-intro/load-csv 它似乎与我之前的评论相矛盾“当使用 MERGE 或 MATCH 和 LOAD CSV 时,我们需要确保我们对属性有索引或唯一约束我们正在合并。这将确保查询以高性能的方式执行。” MERGE 操作可以利用索引来确定节点是否已经存在。如果没有索引,随着时间的推移,您的合并将花费更长的时间来执行,因为 neo4j 必须扫描所有现有的 Customer 节点(最多 200 万个!)以检测重复。我从您的回答中看到您已经验证了这一点。 谢谢。您的回答和 cmets 对我很有帮助。【参考方案2】:

关键是在添加任何数据之前添加“唯一约束”。这使该过程更快。我从https://neo4j.com/docs/getting-started/current/cypher-intro/load-csv/ 看到 现在是这样的脚本

CREATE CONSTRAINT ON (n:Movie) ASSERT n.no IS UNIQUE;
USING PERIODIC COMMIT 10000
LOAD CSV FROM 'file:///data/MovieData.csv' AS r
WITH r[0] AS no, toInteger(r[1]) AS status, toInteger(r[2]) as activation_date
MERGE (p:Movie no: no)
ON CREATE SET p.status = status, p.activation_date = activation_date

在 1 分钟内添加 100 万个节点。之前是2-3天以上。

【讨论】:

唯一约束会自动为您创建一个索引,而 index 是导致性能提升的原因。如果你刚刚创建了一个索引,你会得到同样的提升。但是,当然,如果你真的想强制唯一性,你应该创建一个唯一性约束。

以上是关于如何打印日志和测量执行时间的主要内容,如果未能解决你的问题,请参考以下文章

通过AOP实现全局日志打印

打印日志查看调接口时间

启动appium server时打印日志时间

启动appium server时打印日志时间

自定义注解并封装成jar包,实现一般方法和Controller类的入参出参和执行时间的日志打印

Goland 命令行打印日志不全,执行正常日志未打印