[ZODB-Dev] How to check for setting the same values on persistent objects?

Alexandre Garel alex.garel at tarentis.com
Thu May 5 12:27:20 EDT 2011


Le 04/05/2011 11:53, Hanno Schlichting a écrit :
> Hi.
>
> I tried to analyze the overhead of changing content in Plone a bit. It
> turns out we write back a lot of persistent objects to the database,
> even tough the actual values of these objects haven't changed.
>
> Digging deeper I tried to understand what happens here:
>
> 1. persistent.__setattr__ will always set _p_changed to True and thus
> cause the object to be written back
> 2. Some BTree buckets define the "VALUE_SAME" macro. If the macro is
> available and the new value is the same as the old, the change is
> ignored
> 3. The VALUE_SAME macro is only defined for the int, long and float
> value variants but not the object based ones
> 4. All code in Products.ZCatalog does explicit comparisons of the old
> and new value and ignores non-value-changes. I haven't seen any other
> code doing this.
>
> I'm assuming doing a general check for "old == new" is not safe, as it
> might not be implemented correctly for all objects and doing the
> comparison might be expensive.

I know very few of ZODB internals but in Python "old == new" does not 
means "old is new"

I don't know the way ZODB retrieve a particular object exactly but I 
assume it does this using _p_oid. So for persistant classes you could 
check old._p_oid == new._p_oid. For string, int you can of course use 
old is new.

Sorry if I'm wrong, as I may miss lot of thing !

Alex


More information about the ZODB-Dev mailing list