[Zope-dev] large PersistentMapping

Robin Becker robin@jessikat.fsnet.co.uk
Tue, 14 Nov 2000 20:14:42 +0000


I'm trying to build a Reverse Cross Referencing Product. The idea is to
enable documents to know which other documents in the Zope data base are
pointing at them.
I would like to use a persistent mapping to store the link information,
but since eventually the object might be quite large will I get a
performance hit when accessing only a small part of the object.

It certainly seems to work for small instances, but I'm worried about
what happens as my structure gets larger. Is there an alternate way to
do this?


The heart of the object are the methods

 
        def __init__(self, id, title):
                '''Initialise a new instance of RXRef'''
                self.id=str(id)
                self.title = str(title)
                self.title = title
                self._N = PersistentMapping()

        def addNode(self,n):
                '''Add a new node if not known'''
                N = self._N
                if not N.has_key(n): N[n]=[]

        def addLinks(self,src,DST):
                '''We have a single src and multiple destinations'''
                if type(DST) not in SEQTYPES: DST = [DST]
                N = self._N
                for dst in DST:
                        self.addNode(dst)
                        if src not in N[dst]: N[dst].append(src)

        def delLinks(self,src,DST):
                '''We have a single src and multiple destinations'''
                if type(DST) not in SEQTYPES: DST = [DST]
                N = self._N
                for dst in DST:
                        if N.has_key(dst):
                                if src in N[dst]:
                                        N[dst].remove(src)
                                        if N[dst]==[]: del N[dst]

        def getRLinks(self,dst):
                '''get links pointing to dst'''
                N = self._N
                return N.has_key(dst) and N[dst][:] or []

-- 
Robin Becker