[geos-devel] Fast collect() aggregate

strk strk at keybit.net
Tue Oct 28 11:59:48 EST 2003


I've made the fast collect() aggregate.
It uses geom_accum() as state transaction function
and a newly made collect_garray() as final function.

Running time to collect  8109 objects in 8102 geometries
goes from 32 minutes to less then 5 minutes.

I strongly belive no much more memory is used by new implementation
since array-accumulated geometries will be (in this case) bigger
then result collection by 8102 geometry headers (number of geoms in input).

Memory usage evaluation - though - is not easy with postgresql.

Anyway: here is how to enable 'fastcollect':

If you did not already do it for 'fastunion' create the geom_accum() function:

        CREATE FUNCTION geom_accum (geometry[],geometry)
                RETURNS geometry[]
                AS '$libdir/../libpostgis.so.0.8'
                LANGUAGE 'C';

Create the new collect_garray function and the aggregate:

        CREATE FUNCTION collect_garray (geometry[])
                RETURNS geometry
                AS '$libdir/../libpostgis.so.0.8'
                LANGUAGE 'C';

        CREATE AGGREGATE fastcollect (
                sfunc = geom_accum,
                basetype = geometry,
                stype = geometry[],
                finalfunc = collect_garray
        );
                                                        [

PS: remember to get in sync with CVS.

--strk;



More information about the geos-devel mailing list