至少 pgRouting 的某些部分可以与并行查询并行运行吗?

问题描述 投票:0回答:1

目标

我想为可路由图中的每对顶点运行

pgr_dijkstra
。我有一个简单的脚本,它获取每对顶点并针对数据库启动
pgr_dijkstra

使用 PostgreSQL 并行查询 功能来加速它会很好。

我想实现一个“简单”的加速,而不需要像contractions这样的高级代码。

问题

虽然我可以看到我的一些表

explain analyze
显示了一个涉及
Gather
Parallel Seq Scan
的计划,但尝试在启用“并行”参数和
pgr_dijkstra
关键字的情况下运行
PARALLEL SAFE
实际上会使它变慢.

输入数据

我有一个支持 PostGIS 的数据库,其中有一些

OSM
数据是用
osm2pgsql
:

导入的
数据 尺码
节点(顶点)表 730 个顶点
节点(顶点)表 160 KB
边桌 1100 个顶点
边桌 656 KB

PostgreSQL 和系统配置

CPU:第 11 代英特尔酷睿 i7-1165G7

PostgreSQL 参数 价值
min_parallel_table_scan_size
8kB
force_parallel_mode
关闭
parallel_setup_cost 
10
parallel_tuple_cost
0.001
max_parallel_workers_per_gather
8
max_parallel_workers
8
 max_worker_processes
8

我已根据

此建议
force_parallel_mode
设置为off,但即使
on
也没有任何区别。

parallel_tuple_cost
从默认值更改为
0.001
似乎没有帮助.

查询和结果

我已经设置了一个非常简单的

pgr_dijkstra
调用,有和没有
SAFE
,原点/目的地顶点的
id
s硬编码:

CREATE OR REPLACE 
FUNCTION pgr_parallel() 
RETURNS VOID 
AS $$
    BEGIN
    PERFORM pgr_dijkstra(
    '
      SELECT gid AS id,
        source,
        target,
        length_m AS cost
      FROM edges_table 
      WHERE
                        NOT source IS NULL
                        AND
                        NOT target IS NULL
                        AND
                        NOT the_geom IS NULL
                        AND NOT length_m IS NULL
    ',
    ARRAY[161]
    ,
    ARRAY[639]
   ,
    directed := false
    );
    END;
$$ LANGUAGE 'plpgsql'
PARALLEL SAFE;

我有一个简单的脚本调用了这个函数N次,看起来并没有并行运行:

功能类型 顶点对的数量(N) 执行时间
未定义(不平行) 50,000 67秒
PARALLEL SAFE
50,000 89秒

作为附加观察,我运行

htop
并看到在开始时,当(并行)脚本运行时,所有 8 个物理内核都被使用。但是,当脚本完成向数据库发送“任务”时,
htop
显示
postgres
进程只使用了一个核心。

问题

如果我理解正确,如果有一些重要的独立工作要由每个工人完成,则查询可以“并行化”。在

pgr_dijkstra
和任何其他最短路径查找算法的情况下,不是这种情况吗?我想
pgr_dijkstra
获取顶点和边,然后对它们运行独立的计算。

是否可以使用

parallel query
PostgreSQL
能力来使
pgr_dijkstra
的至少某些部分并行运行?如果是,如何?

注意: 在 Crunchy Data 和 Paul Ramsey 的this post 中,

PARALLEL SAFE
用于包含
pgr_dijkstra
的函数,但没有详细说明它是否因此运行得更快。

postgresql parallel-processing postgis pgrouting
1个回答
0
投票

运行

\df+ pgr_dijkstra;
,我们看到函数是
parallel unsafe
,所以不,您将无法在单个查询中并行化它。

但是您可以尝试使用多个连接并行运行多个查询(即在不同的顶点对之间)。请记住,他们将争夺相同的资源。

© www.soinside.com 2019 - 2024. All rights reserved.