Por que uma função de roteamento pgr_ * demora para sempre com base nos dados do OSM em um banco de dados habilitado para pgrouting

9

Carreguei o conjunto de dados OSM alemão no banco de dados pgrouting usando osm2po 4.7.7. Tudo funciona bem. Eu tenho o osm2po configurado via sua configuração e está funcionando como um encanto pela parte Java.

Eu tive a tabela * _2po_4pgr importada sem problemas. Até a tabela * 2po_v é importada, embora eu não entenda completamente a relação dessa tabela.

Eu executei a função pgr_createTopology, que funcionou por um bom tempo (12000 segundos) enquanto calculava todas as bordas de 6m. Eu pensei que isso faria o acordo, mas ainda é insuportavelmente lento.

Gostaria de saber se esqueci alguma coisa. Eu estava pensando em usar o pgRouting em vez da biblioteca java, mas no momento seu desempenho é apenas uma comparação.

Johnny Cusack
fonte
11
você criou índices, ajustou as variáveis ​​de memória do postgis? O createTopology é executado apenas uma vez para todo o conjunto de dados, portanto, seu desempenho não importa tanto. Nota. Eu tive toda a Finlândia do conjunto de dados digiroad (como 2G da rede rodoviária) e retornei resultados no máximo 250 ms, geralmente 125ms sem otimizações. Portanto, deve ser melhor agora dias
simplexio 26/08/13
Existem índices na coluna de origem e destino criados automaticamente pelo gerador de scripts osm2po. Mais necessário? Mudei os work_mem / maintenance_work_mem variáveis para um valor GigaByte, reiniciado, ainda nenhuma mudança. Existe algum modelo de script de inicialização que eu possa precisar?
Johnny Cusack
11
Hmmm ... O que createTopology () faz? Quero dizer, o osm2po já cria a topologia baseada em IDs de nó OSM. Portanto, não há necessidade de executar o sth. semelhante novamente. Para pgRouting (shortest_path & shortest_path_astar), você só precisa da tabela 4pgr criada. Isso é tudo.
Carsten
Agora tenho o conjunto de dados da finlândia, postgis 2.0.3, pgrouting 2.0.0-dev. E eu tenho que dizer que isso é lento. sempre mais de 1 segundo para obter resultados ao usar pgr_astar (). I verificar se eu recebo este pouco mais rápido
simplexio

Respostas:

5

Problema com o desempenho do pgRouting parece que o novo pgr_astar e pgr_dijkstra usam o gráfico inteiro (o que garante a solução, se houver). A solução simples para obter melhor desempenho é limitar o gráfico usado a uma área menor. Tem problemas próprios, como às vezes pode criar gráficos que não podem ser resolvidos

 (SELECT ST_Expand(ST_Extent(geom_way),0.1) as box  FROM hh_2po_4pgr as l1 WHERE l1.source =7 OR l1.target = 12) 

Cria BBOX sobre a coleção de origem e destino e a expande em 0,1 graus; a mesma consulta é usada para limitar o tamanho do gráfico na consulta pgr_

Dijkstra de 1.2s a ~ 65ms

SELECT  seq, id1 AS node, id2 AS edge, g.geom_way as the_geom
    FROM pgr_dijkstra(
            'SELECT id, source, target, cost FROM hh_2po_4pgr as r, 
            (SELECT ST_Expand(ST_Extent(geom_way),0.1) as box  FROM hh_2po_4pgr as l1    WHERE l1.source =7 OR l1.target = 12) as box
            WHERE r.geom_way && box.box',
            7, 12, false, false
    ) as r INNER JOIN hh_2po_4pgr as g ON r.id2 = g.id ;

A * de 2s a ~ 50ms

SELECT seq, id1 AS node, id2 AS edge, cost
    FROM pgr_astar(
           'SELECT id, source, target, cost, x1,y1,x2,y2 FROM hh_2po_4pgr as r, 
             (SELECT ST_Expand(ST_Extent(geom_way),0.1) as box  FROM hh_2po_4pgr as l1    WHERE l1.source =7 OR l1.target = 12) as box
            WHERE r.geom_way && box.box',
            7, 12, false, false
    );

o osm2po foi usado para importar dados (último da finlândia) para a tabela postgis. índice de essência adicionado à coluna geom_way e análise de vácuo total executada no banco de dados. memória compartilhada 1G. workmem 512M

simplexio
fonte
Eu tive a mesma idéia com a caixa delimitadora, ainda assim mais de 90 segundos, mesmo com memória vars definir etc.
Johnny Cusack
eu tenho 380k linhas? você provavelmente tem algo como 3M + linhas na tabela de roteamento?
simplexio 27/08/13
11
Este é um dos principais problemas no Postgres para não armazenar em cache o gráfico inteiro. Funciona bastante rápido. Mas eu preciso conectá-lo com outros bancos de dados-tabelas que cria na situação atual (test-) um enorme gargalo com apenas 5qps (consultas por segundo)
Johnny Cusack
11
Acabei de carregar um subconjunto de 1 milhão de linhas em um ramdisk para comparar. pgr_dijkstra leva 3 segundos em uma corrida a frio. pgr_astra com o exemplo bbox fornecido por @simplexio, leva cerca de 900ms para uma corrida a frio. Então, parece que eu tenho que colocar tudo em um ramdisk para um desempenho adequado.
Johnny Cusack
11
Ótimo! com os índices do @ kttii, estou correndo rápido agora!
Magno C
5

Finalmente cheguei à conclusão de que é melhor colocar o gráfico inteiro (incluindo índices) em um espaço de tabela separado, que reside permanentemente na memória usando um ramdisk.

Para configurar o ramdisk no Ubuntu 13.04, usei as seguintes instruções e devo dizer que está funcionando muito bem (inclui instruções para recarregar os dados na memória após uma reinicialização / reinicialização).

Na próxima semana, vou conhecer os novos SSDs (leitura de 1 GB / s) e tentar comparar o desempenho.

Até onde eu vejo, é a única solução para manter um gráfico de linhas de mais de 1 milhão permanentemente acessível, pois há uma leitura aleatória contínua acontecendo.

Johnny Cusack
fonte
Como você criou o gráfico inteiro (incluindo índices)? Não vi nada na documentação do pgrouting.
Dennis Bauszus
Eu usei o osm2po, um pedaço incrível de código java! osm2po.de
Johnny Cusack
5

Use este guia para configurar índices para um banco de dados espacial. Aqui está a essência disso:

 1. create indexes on ID, source and target columns.
 2. create index using GIST on geom column.
 3. vacuum
 4. cluster on geom column
 5. analyze

para minhas tabelas _4pgr e _vertex, apenas as colunas de origem e de destino tinham índices após a importação (osm2po-core-5.1.0).

kttii
fonte
Fantástico! de ~ 45 segundos a ~ 15 segundos usando o OSM completo da América do Sul com autoatendimento.
Magno C
Desculpe meu erro. de ~ 45 seg a ~ 5 ms !!!!!!
Magno C