【问题标题】:All simple (cyclic) paths query returns too much data -> heap overflow所有简单(循环)路径查询返回太多数据 -> 堆溢出
【发布时间】:2021-04-28 19:52:02
【问题描述】:

我是 Neo4j 的新手,并且使用带有 Javascript 驱动程序的 Neo4j 桌面版本。我的图表有大约 30.000 个节点和 40.000 条边。最后一种方法是在图中获取所有简单循环,但在尝试执行以下密码查询时我面临堆溢出:

let res = await session.run('MATCH p=(n)-[*2..4]-(n) RETURN nodes(p)')

这当然是因为查询会尝试返回找到的所有简单循环,这对我的堆来说非常重要,并且不幸地增加了 node.js 的内存不是一种选择。

那么有什么办法可以绕过这个问题并从图中获取所有简单的循环?

这是我得到的堆溢出错误:

/Users/paulus/.nvm/versions/node/v15.10.0/bin/node /Users/paulus/routeplanner/RouteFinder.js

<--- Last few GCs --->

[39630:0x104e00000]   227813 ms: Scavenge (reduce) 2033.5 (2077.9) -> 2032.1 (2072.1) MB, 113.5 / 0.0 ms  (average mu = 0.577, current mu = 0.321) allocation failure 
[39630:0x104e00000]   228171 ms: Scavenge (reduce) 2036.5 (2072.6) -> 2035.5 (2075.6) MB, 28.6 / 0.0 ms  (average mu = 0.577, current mu = 0.321) allocation failure 
[39630:0x104e00000]   228558 ms: Scavenge (reduce) 2039.1 (2075.6) -> 2038.5 (2080.4) MB, 28.2 / 0.0 ms  (average mu = 0.577, current mu = 0.321) allocation failure 


<--- JS stacktrace --->


<--- Last few GCs --->

[39630:0x104e00000]   227813 ms: Scavenge (reduce) 2033.5 (2077.9) -> 2032.1 (2072.1) MB, 113.5 / 0.0 ms  (average mu = 0.577, current mu = 0.321) allocation failure 
[39630:0x104e00000]   228171 ms: Scavenge (reduce) 2036.5 (2072.6) -> 2035.5 (2075.6) MB, 28.6 / 0.0 ms  (average mu = 0.577, current mu = 0.321) allocation failure 
[39630:0x104e00000]   228558 ms: Scavenge (reduce) 2039.1 (2075.6) -> 2038.5 (2080.4) MB, 28.2 / 0.0 ms  (average mu = 0.577, current mu = 0.321) allocation failure 


<--- JS stacktrace --->

FATAL ERROR: MarkCompactCollector: young object promotion failed Allocation failed - JavaScript heap out of memory
FATAL ERROR: MarkCompactCollector: young object promotion failed Allocation failed - JavaScript heap out of memory

<--- Last few GCs --->

[39630:0x104e00000]   227813 ms: Scavenge (reduce) 2033.5 (2077.9) -> 2032.1 (2072.1) MB, 113.5 / 0.0 ms  (average mu = 0.577, current mu = 0.321) allocation failure 
[39630:0x104e00000]   228171 ms: Scavenge (reduce) 2036.5 (2072.6) -> 2035.5 (2075.6) MB, 28.6 / 0.0 ms  (average mu = 0.577, current mu = 0.321) allocation failure 
[39630:0x104e00000]   228558 ms: Scavenge (reduce) 2039.1 (2075.6) -> 2038.5 (2080.4) MB, 28.2 / 0.0 ms  (average mu = 0.577, current mu = 0.321) allocation failure 


<--- JS stacktrace --->

FATAL ERROR: MarkCompactCollector: young object promotion failed Allocation failed - JavaScript heap out of memory

Process finished with exit code 139 (interrupted by signal 11: SIGSEGV)

【问题讨论】:

    标签: node.js neo4j cypher neo4j-driver neo4j-desktop


    【解决方案1】:

    在不了解图表的数据模型的情况下很难为您提供准确的解决方案,但使用跳过/限制来获取较小批量的数据可能会有所帮助。

    这会得到前 100 个模式:

    MATCH p=(n)-[*2..4]-(n) RETURN nodes(p) SKIP 0 LIMIT 100
    

    接下来的 100 个:

    MATCH p=(n)-[*2..4]-(n) RETURN nodes(p) SKIP 100 LIMIT 100
    

    【讨论】:

    • 这很完美,但我如何找出限制?
    • 如果您参考模式总数,您可以先使用计数进行查询 (MATCH p=(n)-[*2..4]-(n) RETURN count(p))要知道总数。但是如果你提到批量大小,你必须根据你拥有的数据量和它的大小来计算它(大到不能做很多查询,但又不能大到会失败)。
    • 我正在寻找模式的总数...谢谢!
    猜你喜欢
    • 1970-01-01
    • 2021-12-21
    • 2020-10-26
    • 2017-06-04
    • 1970-01-01
    • 2019-09-30
    • 2019-05-16
    • 2015-08-21
    • 1970-01-01
    相关资源
    最近更新 更多