[Community] ZCatalog spatial index
Eric Bréhault
ebrehault at gmail.com
Wed Aug 8 18:49:13 EEST 2007
Hello,
I use Rtree now but I still have some persistence issues:
as Rtree object cannot be pickled, my objective was to store the index in
the file system
so I have built a wrapper (named ZRtree) which has a rtree instance:
newrtree=Rtree("my_filename")
self.rtree=newrtree
using __getstate__ I make sure self.rtree is not pickled
and using __setstate__, I reload self.rtree from my_filename.idx and
my_filename.dat
unfortunately it doesn't work: the produced files are corrupted, it makes
Zope to crash violently when calling __setstate__, and if I try to load the
index manually from Python prompt, I get this error:
terminate called after throwing an instance of
'Tools::IllegalStateException'
the strange thing is:
- when running my unit test, it works fine, and I can load the exported
index files manually from Python prompt
- if I build a Rtree object but do not insert it in self (I mean if I remove
self.rtree=newrtree), the files are correct too
so it is definitely due to the ZODB and the persistence management
but I do not understand why it would impact my index files
Any idea ?
Eric
Here is the code of my wrapper:
from rtree import Rtree
import os
from random import random
from time import time
from md5 import md5
class ZRtree:
"""
RTree wrapper
The index content is saved in a file which will not be serialized in
ZODB
"""
def __init__(self):
filename = md5(str(time() *
1000L)+str(random()*100000000000000000L)).hexdigest()
self.file = filename
self.rtree = None
def getRtree(self):
if self.rtree is None:
try:
os.remove(file+'.dat')
os.remove(file+'.idx')
except:
pass
r=Rtree(self.file)
self.rtree = r
return self.rtree
def add(self, i, coords):
return self.getRtree().add(i, coords)
def delete(self, i, coords):
return self.getRtree().delete(i, coords)
def intersection(self, coords):
return self.getRtree().intersection(coords)
def __getstate__(self):
odict = self.__dict__.copy()
del odict['rtree']
return odict
def __setstate__(self,dict):
self.__dict__.update(dict)
try:
self.rtree = Rtree(self.file)
except Exception(e):
logger.error(e)
On 7/30/07, Kai Lautaportti <kai.lautaportti at hexagonit.fi> wrote:
>
> Hi Eric and Sean
>
> Eric Bréhault wrote:
> > Hello Sean,
> >
> > Yes, I found the persistence problem.
> > My solution was to let the Quadtree index volatile (index._v_quadtree)
> > so Zope does not try to persist it, and on first use, I rebuild it
> entirely.
>
> Using a volatile attribute to store the index may produce unexpected
> behaviour if you expect it to be built once on startup and be maintained
> indefinitely there after (until the next Zope restart of course).
>
> The ZODB does not (in theory) make any promises how long a volatile
> attribute is stored and you might end up needing to rebuild the index
> more often than you wish. Also the per connection locality of volatile
> attributes and the fact that the index depends on data from multiple
> objects may prove troublesome.
>
> More info at http://wiki.zope.org/ZODB/VolatileAttributes
>
> >
> > I will use ArrTree.
>
> I also think this will be the best option for us.
>
> cheers,
> Kai
>
> >
> > Thanks,
> >
> > Eric
> >
> > On 7/29/07, *Sean Gillies* <sgillies at frii.com
> > <mailto:sgillies at frii.com>> wrote:
> >
> > Eric Bréhault wrote:
> > > Hello,
> > >
> > > Did anybody already tried to implement a spatial index to handle
> > spatial
> > > operators directly in the ZCatalog ?
> > > I want to try to do it, but if anybody has some feedback and/or
> > idea about
> > > it, it would help.
> > >
> > > Regards,
> > >
> > > Eric
> >
> > Shaun Walbridge and I worked on
> >
> > http://trac.gispython.org/projects/PrimaGIS/browser/SpatialIndex
> > <http://trac.gispython.org/projects/PrimaGIS/browser/SpatialIndex>
> >
> > at the 2006 Plone Conference sprint. The tests should be
> > self-explanatory. The one obstacle for us at the time was that there
> > wasn't a way to persist the index, which means that it's not really
> > ready for production.
> >
> > Now, there is an alternative index
> >
> > http://trac.gispython.org/projects/PCL/wiki/ArrTree
> >
> > which *can* be persisted (to a file on disk), and would be a better
> > foundation for a Zope spatial index. It's been on my to-do list for
> a
> > while. My Pleiades project has ~1000 features now, but will need a
> > spatial index before it can grow much larger.
> >
> > Cheers,
> > Sean
> >
> > _______________________________________________
> > Community mailing list
> > Community at lists.gispython.org <mailto:Community at lists.gispython.org>
> > http://lists.gispython.org/mailman/listinfo/community
> >
> >
> >
> > ------------------------------------------------------------------------
> >
> > _______________________________________________
> > Community mailing list
> > Community at lists.gispython.org
> > http://lists.gispython.org/mailman/listinfo/community
>
>
> --
> Kai Lautaportti +358-50-558-7935
> Software engineer www.hexagonit.fi
> Hexagon IT Oy kai.lautaportti at hexagonit.fi
> _______________________________________________
> Community mailing list
> Community at lists.gispython.org
> http://lists.gispython.org/mailman/listinfo/community
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.gispython.org/pipermail/community/attachments/20070808/9673ba82/attachment.htm>
More information about the Community
mailing list