【问题标题】: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 浏览器上打印内容?

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

【问题讨论】:

    标签: neo4j cypher graph-databases


    【解决方案1】:
    1. 您的第一个查询使用 500 的批处理大小,而您的第二个查询使用大 20 倍的批处理大小。您需要使用相同的批量大小进行有效比较。

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

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

    4. 您应该考虑是否应将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 是导致性能提升的原因。如果你刚刚创建了一个索引,你会得到同样的提升。但是,当然,如果你真的想强制唯一性,你应该创建一个唯一性约束。
    猜你喜欢
    • 2016-01-18
    • 1970-01-01
    • 2016-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多