我想为可路由图中的每对顶点运行
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 |
CPU:第 11 代英特尔酷睿 i7-1165G7
PostgreSQL 参数 | 价值 |
---|---|
|
8kB |
|
关闭 |
|
10 |
|
0.001 |
|
8 |
|
8 |
|
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秒 |
|
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
的函数,但没有详细说明它是否因此运行得更快。
运行
\df+ pgr_dijkstra;
,我们看到函数是 parallel unsafe
,所以不,您将无法在单个查询中并行化它。
但是您可以尝试使用多个连接并行运行多个查询(即在不同的顶点对之间)。请记住,他们将争夺相同的资源。