Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance PostgreSQL函数和内存问题_Performance_Postgresql_Memory_Pgrouting - Fatal编程技术网

Performance PostgreSQL函数和内存问题

Performance PostgreSQL函数和内存问题,performance,postgresql,memory,pgrouting,Performance,Postgresql,Memory,Pgrouting,在从这个网站得到了很多帮助之后,我终于创建了一组功能,完成了我想要的工作。谢谢,但似乎还有最后一个问题,那就是有效的内存使用。问题是: 在postgreSQL 9.3中,我使用postGIS 2.1和pgRouting 2.0创建了一个函数,该函数使用pgRouting函数pgr_trsp计算两点之间的路线,并返回几何图形(线字符串)值。代码如下: CREATE OR REPLACE FUNCTION fm_pgr2geom(edge1 integer, pos1 double precisio

在从这个网站得到了很多帮助之后,我终于创建了一组功能,完成了我想要的工作。谢谢,但似乎还有最后一个问题,那就是有效的内存使用。问题是:
在postgreSQL 9.3中,我使用postGIS 2.1和pgRouting 2.0创建了一个函数,该函数使用pgRouting函数pgr_trsp计算两点之间的路线,并返回几何图形(线字符串)值。代码如下:

CREATE OR REPLACE FUNCTION fm_pgr2geom(edge1 integer, pos1 double precision, edge2 integer, pos2 double precision)
  RETURNS geometry AS
$BODY$
--We have to do a routing query. And declare a cursor for it
DECLARE resc CURSOR FOR
SELECT * FROM pgr_trsp (
    'SELECT * FROM th_2po_4pgr',
    $1, $2, $3, $4, false, true);
doline geometry[];
temp_point geometry;
geom geometry;
temp_rec RECORD;
n integer;
BEGIN

--Append all the edges
FOR temp_rec IN SELECT * FROM pgr_trsp (
    'SELECT * FROM th_2po_4pgr',
    $1, $2, $3, $4, false, true) LOOP
        doline := array_append(
        doline, (SELECT map.geom_way FROM th_2po_4pgr map WHERE map.id = temp_rec.id2));
END LOOP;
--Remove 1st and last edge
n := array_length (doline, 1);
doline := doline [2:n-1];
--Find startpoint and append to doline
doline := array_prepend(
    ST_LineInterpolatePoint((SELECT map.geom_way FROM th_2po_4pgr map WHERE map.id = $1),$2),doline);
--Append the endpoint
doline := array_append(
    doline,ST_LineInterpolatePoint((SELECT map.geom_way FROM th_2po_4pgr map WHERE map.id = $3),$4));
geom := ST_MakeLine(doline);
RETURN geom;
EXCEPTION
WHEN SQLSTATE 'XX000' THEN RETURN NULL;
WHEN SQLSTATE '38001' THEN RETURN NULL;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION fm_pgr2geom(integer, double precision, integer, double precision)
  OWNER TO postgres;
此函数用于在另一个函数中使用几何体结果批量更新大表(800k+)。以下为参考:

CREATE OR REPLACE FUNCTION fm_seqrouting()
  RETURNS integer AS
$BODY$
--Declarations
DECLARE
    r record;
    i integer;
BEGIN
--CODE to calculate routes and update table
    i := 0;
FOR r IN 
    SELECT  veh_id
        ,dt
        ,map_edge_id                AS map_id1
        ,map_edge_pos               AS map_pos1
        ,lead(map_edge_id)      OVER w  AS map_id2
        ,lead(map_edge_pos)     OVER w  AS map_pos2
    FROM taxilocs
    WINDOW w AS (ORDER BY veh_id, dt)
    LOOP

        UPDATE taxilocs
            SET geom_route = fm_pgr2geom (r.map_id1,r.map_pos1,r.map_id2,r.map_pos2)
            WHERE r.veh_id = taxilocs.veh_id AND r.dt=taxilocs.dt;
        i := i + 1;

    END LOOP;
RETURN i;
END;
$BODY$
  LANGUAGE plpgsql;  
这些异常是绝对必要的,因为它们处理上述表中缺少某些数据或找不到路由路径的某些情况。但是,似乎是它们造成了问题,即更新查询在几分钟后崩溃。执行几分钟后,我收到的消息是:

错误:内存不足
SQL状态:53200
详细信息:根据的请求失败 尺寸640000

所以问题是:我如何有效地使用或重新编码这个函数来更新我想要的表?有什么想法吗?

提前谢谢你

尝试使用下面的命令从命令行运行sql
psql-h-d-U-p-f

当查询“崩溃”时,您会收到什么消息?您使用的是哪个版本的PostgreSQL?更新崩溃的函数在哪里?@JustBob我用你问的信息更新了我的问题。也许你现在可以给我一些提示?你的表上有索引吗?你能提供DDL吗?PostgreSQL是针对32位还是64位编译的。我记得过去人们在32位上有这样的问题,但在64位上运行良好。@JustBob经过一些研究后,我发现我的表都没有索引。因为我是一个新用户,你能给我一些关于如何选择索引和如何定义索引的提示吗?然而,我觉得我编写异常代码的方式有些“错误”。从我的测试中可以看出,查询运行的时间越长(即它进入EXCEPTION块的次数越多),系统上的内存负载就越重,我觉得重复EXCEPTION就是原因。有什么线索吗?我的系统是Windows7 64位,有点晚了,但我可能会面临类似的问题。我使用
pgr\u trsp
计算路由,并尝试将它们插入表中。你解决了吗?