[geos-devel] GEOSGetCoordinates() and performance (postgis bug
fix)
strk
strk at keybit.net
Mon Oct 27 10:40:19 EST 2003
I'm working on the small-but-fast interface.
Can Chris check out serialization of either geos geometry or
some other intermediate class used for Overlay Operations
(like PlanarGraph or something) ? Martin, any help on this ?
--strk;
pramsey wrote:
> I was talking about this with Chris a week ago, and we came to similar
> conclusions, with one difference: we think we need to have both methods
> available. A CPU intensive but memory light version for large-but-slow
> queries and an optimized but memory heavy version for small-but-fast
> interactive queries. Neither version can meet all the likely use cases
> for a union aggregate on their own.
> P
>
> On Monday, October 27, 2003, at 03:36 AM, strk wrote:
>
> > Defining a new postgres type for geos-geom might give a better
> > performance
> > but sounds (IMHO) like a slow development process. I've been thinking
> > about this thought. Here is what I propose:
> >
> > We now have, for each row in input relation:
> >
> > CASE 1:
> > ITERATE:
> > 1) pgis->geos conversion (first arg)
> > 2) pgis->geos conversion (second arg)
> > 3) geosUnion call
> > 4) geos->pgis conversion (result)
> >
> > Note that step 1 will be for each iteration after the first EXACTLY the
> > output of step 3 from previous iteration. We could use a final func
> > for the whole job to be done and a state transaction function to just
> > gather informations about which geometries to work on.
> >
> > CASE 2:
> > ITERATE:
> > 1) get geometry array (first arg)
> > 2) get geometry (second arg)
> > 3) append geometry to array
> > END:
> > 1) UNION = array[0]->geos (conversion)
> > 2) for each array item N > 0
> > 3) nextgeom = array[N]->geos (conversion)
> > 4) geosUnion call (UNION, nextgeom)
> > 5) end
> > 6) geos->pgis conversion (UNION)
> >
> > With N input geometries we will have the following conversions:
> > CASE 1: 2*N pgis->geos + N geos->pgis (might be missing something)
> > CASE 2: N pgis->geos + 1 geos->pgis
> >
> > Anyway, CASE 2 seems nicer with system resources.. but it might be
> > very memory expensive! If output geometry will be just a collection
> > of input geometries that big memory will be allocated anyway, thus
> > as long as we release each array element as soon as added to the
> > output geometry this will not be a big deal. On the other hand, if
> > resulting union will remove a lot of borders allocated memory will
> > be much more then the size required by step-by-step processing.
> >
> > What do you think about this solution ?
> >
> > --strk;
> >
> > chodgson wrote:
> >> The way postgres handles user-defined aggregate functions is what is
> >> limiting
> >> you. The problem is that aggregates are designed to use a
> >> "one-at-a-time"
> >> approach to aggregating, which means that at each step of the process
> >> you must
> >> have "geom UNION geom = geom".
> >>
> >> Clearly, if there was a postgres type which was a serialized GEOS
> >> gemetry (call
> >> it type geos_geom) then we could write a geos_geom_union function
> >> which was
> >> geos_geom UNION geos_geom = geos_geom, and as long as the
> >> serialization can be
> >> done quickly (and is even possible?) then a faster union aggregate
> >> could result
> >> from a query like:
> >>
> >> SELECT geos_geom_to_geom( geos_geom_union( geom_to_geos_geom(
> >> the-geom ) ) )
> >> FROM the_table GROUP BY class_id;
> >>
> >> I don't know enough C/C++ to know if such a serialization of a GEOS
> >> geometry is
> >> possible, or fast... but if so, this would probably do it.
> >>
> >> It could even be possible to re-write all of the geos functions to
> >> accept
> >> geos_geom objects, and have standard geom object be auto-typecast into
> >> geos_geom objects (using the "geom_to_geos_geom()" function, of
> >> course)... then
> >> it would be easy to cache the geos objects in between processing
> >> stages - who
> >> knows how big they might be... again, if this is even possible.
> >>
> >> Chris
> >>
> >> Quoting strk <strk at keybit.net>:
> >>
> >>> dblasby wrote:
> >>>> Whenever I call the getCoordinates() function, I immediately make a
> >>>> copy
> >>>> of the list by converting it from the GEOS coordinates to PostGIS
> >>>> POINT3Ds.
> >>>>
> >>>> So, feel free to have all the Postgis GetCoordinates() access
> >>>> read-only
> >>>> version.
> >>>
> >>> I've made a specialized POINT3D-array-from-Polygon function using
> >>> read-only
> >>> direct access to internal Polygon's LinearRings. Speed up is to
> >>> evaluate
> >>> but personally I can not really appreciate it...
> >>>
> >>>> UNIT probably spending a lot of time building Postgis and GEOS
> >>>> geometries.
> >>>>
> >>>> 1. start with 2 input postgis geometrys
> >>>> 2. convert them to GEOS (O(n) where n=# of subcomponents)
> >>>> 3. run union
> >>>> 4. convert back to postgis (O(n) where n=# of subcomponents)
> >>>> 5. start again at step #1
> >>>>
> >>>> As you can see there possibly O(n^2) constructions (and certainly
> >>>> O(n^2)
> >>>> point copies).
> >>>>
> >>>> If you take an input dataset of disjoint polygons, you'll see this
> >>>> is
> >>>> O(n^2) in terms of geometry convertions and copying.
> >>>
> >>> Do you think defining an ad-hoc postgresql type will give it a burst
> >>> ?
> >>>
> >>> --strk;
> >>>
> >>> _______________________________________________
> >>> geos-devel mailing list
> >>> geos-devel at geos.refractions.net
> >>> http://geos.refractions.net/mailman/listinfo/geos-devel
> >>>
> >>
> >>
> >>
> >>
> >>
> >> _______________________________________________
> >> geos-devel mailing list
> >> geos-devel at geos.refractions.net
> >> http://geos.refractions.net/mailman/listinfo/geos-devel
> >>
> Paul Ramsey
> Refractions Research
> Email: pramsey at refractions.net
> Phone: (250) 885-0632
>
>
> _______________________________________________
> geos-devel mailing list
> geos-devel at geos.refractions.net
> http://geos.refractions.net/mailman/listinfo/geos-devel
More information about the geos-devel
mailing list