Simon Cross escribió:
> On 6/5/07, jonhattan <[EMAIL PROTECTED]> wrote:
>> The memory grows and grows indefinitely. If I change to postgres the
>> problem dissapear. I've searched a lot about sqlobject+sqlite and
>> threading without finding a solution.
>
> I imagine that the important difference between Postgres and Sqlite is
> that Sqlite connections are only usable on the thread they're created
> on. So if you're starting 10 000 threads, SQLObject has to create 10
> 000 connections to the SQLite database while in the Postgres case
> threads can share connections.
I figure out that connections are destroyed when the thread finish.. So 
it could be increase the load of the system, not memory consuming. Isn't 
it ?

> It's possible that this alone is causing your problems (tests in our
> work code reliably trigger Sqlite problems with only 20 threads
> writing concurrently).
actually I have a limit of 20 threads:

        while threading.activeCount()  > 19:
            sleep(5)

What I see is that threads are not being 'freed' as they finish. Perhaps 
the question is 'how can I destroy all references to a SQLObject?'
If I do:

o = mySQLObject(item = xxx)
sys.getrefcount(o) - 1    # the value is 2
del o                                # still one reference so the object 
is not removed from memory

> You might also want  to check whether turning off caching in SQLObject
> helps at all (it's vaguely possible that the extra SQLite connections
> result in many more objects being cached). See
> http://www.sqlobject.org/module-sqlobject.cache.html.
I don't know if you mean something more than

class sqlmeta:
        cacheValues = False

and

connectionForURI("sqlite:///mydb.db?cache=")

It seems they do nothing.

> If turning off caching doesn't help, I suggest simply rate limiting
> the threads, storing the results in a temporary array and then having
> the main thread do all the writes to sqlite (this shouldn't be any
> slower than having lots of threads write). Something like:
>
> import time
>
> class get_page(Thread):
>     def __init__(self, id, results):
>         self.id = id
>         self.results = results
>         Thread.__init__(self)
>
>    def run():
>         while True:
>            if len(self.results) > 50:
>                   time.sleep(1)
>                   continue
>            else:
>                   f = urlopen("http://example.com/article/%d"; % id)
>                   self.results.append(f.read())
>
> # main
> tmpdata = []
> done = 0
>
> for i in xrange(1,10000):
>       t = get_page(i,tmpdata)
>       t.start()
>
> while done < 10000:
>      if not tmpdata:
>         time.sleep(1)
>      else:
>         mySQLObject(item = tmpdata.pop())
>         done += 1
>
> This code is, of course, completely untested. :)

I'll try to implement that way and comment back.


thanks,
jonhattan




>
> Schiavo
> Simon
> -- 
> I don't see why people are picky about it when the Banach-Tarski
> paradox is clearly a Biblical principle - look at Mark 6:38-44. What,
> you have a different interpretation of the loaves and fishes thing?
>  -- Daniel Martin, snowplow.org
>


-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
sqlobject-discuss mailing list
sqlobject-discuss@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/sqlobject-discuss

Reply via email to