[elephant-devel] Re: Getting count of the number of persistent objectsof a particular class

Ian Eslick eslick at csail.mit.edu
Mon Jan 21 14:54:00 UTC 2008


In general, instance initialization should always happen inside a  
transaction.  This will catch any updates you do to indices or other  
variables.

The instance initialization code in Elephant only forces transactions  
for subsets of initialization that use cursors, and which under BDB  
would lead to deadlocks or other errors.  This allows developers  
flexibility in breaking up large initialization transactions but the  
consequence is that the set of side effects of a default call to make- 
instance are not atomic unless wrapped in a transaction.

Ian

On Jan 21, 2008, at 8:52 AM, Joubert Nel wrote:

>
> On Mon, 2008-01-21 at 10:58 +0200, Alex Mizrahi wrote:
>> JN> I did some reading through the mailing list archives and the  
>> Elephant
>> JN> manual, but cannot find a recommended way of counting the  
>> number of
>> JN> persistent objects of a particular class.
>>
>> JN> I have a method that works (using map-class) but this is way  
>> too slow
>> JN> for my purposes.
>>
>> JN> I did find some postings from Oct last year about this question  
>> but no
>> JN> definitive answer it seams.
>>
>> JN> Any advice?
>>
>> as far as i know, most btree implementation do not have a fast way  
>> to count
>> leafs -- you need to iterate through all of them.
>> in PostgreSQL (and i think in most relational databases like that)  
>> query
>> "SELECT COUNT(*) FROM tree11" takes time proportional to number of  
>> elements
>> in tree11.
>> of course it would be much faster to do "SELECT COUNT(*)" then  
>> reading all
>> elements on Lisp side, but it will be flawed anyway.
>
> Right, I'm used to doing "SELECT COUNT" SQL statements, which could be
> on any kind of joins and is *very* fast in a relational database.
>
>>
>> so, the advice would be to count this parameter yourself. for  
>> example, make
>> btree class-name -> instance count. and update it in initialize- 
>> instance
>> (you can move this functionality to some instance-counter-mixin  
>> class), and
>> whereever you delete them..
>
> This is a great suggestion.
> Just to verify: the writes to the database from the initialize- 
> instance
> method; will they occur atomically with the consing of the persistent
> class (i.e. I don't need to explicitly wrap things into a  
> transaction)?
>
> Joubert
>
>
> _______________________________________________
> elephant-devel site list
> elephant-devel at common-lisp.net
> http://common-lisp.net/mailman/listinfo/elephant-devel




More information about the elephant-devel mailing list