Opened 14 years ago
Closed 14 years ago
#837 closed defect (fixed)
[raster] ST_MapAlgebra -- I think we have a memory leak
Reported by: | robe | Owned by: | jorgearevalo |
---|---|---|---|
Priority: | blocker | Milestone: | PostGIS 2.0.0 |
Component: | raster | Version: | master |
Keywords: | Cc: |
Description (last modified by )
I tried to do this on my test elephant
-- its a single tile -- I forget the size O
ALTER TABLE ch13.pele ADD column map_rast raster; UPDATE ch13.pele SET map_rast = ST_MapAlgebra(rast,'CASE WHEN rast BETWEEN 100 and 250 THEN 1 WHEN rast = 252 THEN 2 WHEN rast BETWEEN 253 and 254 THEN 3 ELSE 0 END', '2BUI') ;
and it crashes the server after about 13 seconds.
This is on Windows XP latest trunk.
Attachments (1)
Change History (21)
by , 14 years ago
comment:1 by , 14 years ago
Description: | modified (diff) |
---|---|
Version: | 1.5.X → trunk |
comment:2 by , 14 years ago
Description: | modified (diff) |
---|
comment:3 by , 14 years ago
Component: | postgis → postgis raster |
---|---|
Owner: | changed from | to
Summary: | ST_MapAlgebra -- I think we have a memory leak → [raster] ST_MapAlgebra -- I think we have a memory leak |
comment:4 by , 14 years ago
comment:5 by , 14 years ago
Jorge:
I traced it back to trunk/raster/rt_core/rt_api.c#L3025. Hope this helps.
comment:6 by , 14 years ago
Priority: | medium → blocker |
---|
comment:8 by , 14 years ago
Hello Jorge,
I have found that the size of the raster triggers this bug. It happens to me when I process 100x100 rasters, but it does not happen when processing 10x10 rasters.
comment:9 by , 14 years ago
Status: | new → assigned |
---|
Please, give a try to r6958. Now the server doesn't crash for me, but I had to comment SPI_finish calls. Not recommended, I think. I've found this 10-years old unresponded question, with the same problem: http://www.mail-archive.com/pgsql-general@postgresql.org/msg18558.html
I think, I'll try this: http://www.mail-archive.com/pgsql-general@postgresql.org/msg79320.html
And asking pgsql list too. Anyway, give it a try.
comment:10 by , 14 years ago
Replying to dzwarg:
The file changed since I made that last comment.
Thanks David. Really useful :-)
comment:11 by , 14 years ago
Just for the record. Differents behaviors of the function in PostgreSQL 8.4.7 and PostgreSQL 9.0.3 when uncommenting the SPI_finish call:
- PostgreSQL 8.4.7: Crash caused by SIGSEV, segmentation fault.
- PostgreSQL 9.0.3: Error deserializing raster (Unknown pixeltype: 15). And incorrect number of bands reported (32639 instead of 1)
Link to SQL file with the raster table used, 14400 rows: http://dl.dropbox.com/u/6599273/srtm_35_04.tgz
Query that causes different behaviours when SPI_finish is uncommented: select st_mapalgebra(rast, 1, 'rast + 10', '-1 * rast') from srtm_35_04 where rid < 3651
The where clause is not necessary. The problem simply appears when the query processes more than 3650 rows.
comment:13 by , 14 years ago
Without SPI_finish call you get this warning message:
WARNING: transaction left non-empty SPI stack
HINT: Check for missing "SPI_finish" calls.
But the application doesn't crash (for me at least). Now is commented.
comment:14 by , 14 years ago
My first attemp at the C implementation of ST_MapAlgebra ever:
CREATE TYPE geomvalxy AS ( geom geometry, val double precision, x int, y int ); CREATE OR REPLACE FUNCTION ST_PixelAsPolygons(rast raster, band integer) RETURNS SETOF geomvalxy AS $$ DECLARE rast alias for $1; w integer; h integer; x integer; y integer; result geomvalxy; BEGIN SELECT st_width(rast), st_height(rast) INTO w, h; FOR x IN 1..w LOOP FOR y IN 1..h LOOP SELECT ST_PixelAsPolygon(rast, band, x, y), ST_Value(rast, band, x, y), x, y INTO result; RETURN NEXT result; END LOOP; END LOOP; RETURN; END; $$ LANGUAGE 'plpgsql'; -- This query works SELECT ST_MapAlgebra(ST_AddBand(ST_MakeEmptyRaster(5, 5, 0, 0, 1, 1, 0, 0, -1), '8BUI'::text, 0, -1), 'rast + 1') -- This query crashes (certainly because SPI_finish was not done) SELECT ST_PixelAsPolygons(ST_MapAlgebra(ST_AddBand(ST_MakeEmptyRaster(5, 5, 0, 0, 1, 1, 0, 0, -1), '8BUI'::text, 0, -1), 'rast + 1'))
with
ERROR: SPI_connect failed: SPI_ERROR_CONNECT CONTEXT: SQL function "st_pixelaspolygons" statement 1 ********** Error ********** ERROR: SPI_connect failed: SPI_ERROR_CONNECT SQL state: XX000 Context: SQL function "st_pixelaspolygons" statement 1
follow-up: 16 comment:15 by , 14 years ago
Jorge,
Sorry to take so long to reply. On my windows mingw install it gives same message as yours and answers are in right ball park.
Takes 13 seconds to do the map call.
SELECT distinct (r).val FROM (SELECT ST_DumpAsPolygons(map_rast) as r FROM ch13.pele) As foo
Takes 359 ms.
So ST_DumpAsPolygons seems much faster and my elephant is recognizable in open jump. I haven't done any other tests though.
comment:16 by , 14 years ago
Replying to robe:
Jorge,
Sorry to take so long to reply. On my windows mingw install it gives same message as yours and answers are in right ball park.
Takes 13 seconds to do the map call.
SELECT distinct (r).val FROM (SELECT ST_DumpAsPolygons(map_rast) as r FROM ch13.pele) As fooTakes 359 ms.
So ST_DumpAsPolygons seems much faster and my elephant is recognizable in open jump. I haven't done any other tests though.
Great news :-).
comment:17 by , 14 years ago
For the record. The query doesn't crash in Ubuntu 10.10 64bits machine. I guess is a matter of time (takes more time to full the available memory). Classic memory leak here.
Question sent to pgsql-general list:http://archives.postgresql.org/pgsql-general/2011-04/msg00130.php
comment:18 by , 14 years ago
Are you sure the bug is not related to #851 and our own memory management with the context? I would start by understanding 851 and fix it properly. I would not be surprised to see 837 disappear with 851 fixed.
comment:20 by , 14 years ago
Resolution: | → fixed |
---|---|
Status: | assigned → closed |
Fixed in r7025. I close the ticket.
Server crashes when returning serialized generated raster. Debugging.