The problem is fetchall(), is getting all the records to memory. If you want to iterate a large dataset or not so heavy, but have a table with many fields, perhaps you can do it by blocks.
For example using raw sql with dal: example: this fetch by 1000 records queryraw = "select * from mytable %(limit_query)s" def records(query): rows = db.executesql(query) if rows: return True else: return False rec = 0 stage = 0 block = 1000while True: offset = stage * block query = queryraw % {'limitquery': 'LIMIT %s, %s' % (offset, block)} if not records(query): break rows = db.executesql(query) for row in rows: rec += 1 # do something stage += 1 This is not fast but keep memory low. 2012/5/10 szimszon <szims...@gmail.com> > Could it be related? > https://groups.google.com/forum/#!topic/web2py/hmsupVHdDHo/discussion (Memory > leak in standalone DAL (issue #731), can you please help test?) > > 2012. május 10., csütörtök 22:32:53 UTC+2 időpontban szimszon a következőt > írta: > >> Okay. It's clear. >> >> I'm only puzzled about why the memory didn't get freed or reused after >> execution is finished. And if I execute the controller function in 1-2min >> interval mem is still not reused. >> >> So I understand it can eat up the memory but why is all memory locked >> forever and didn't get reused - in my understanding (it's not much) in my >> case GC do not free mem at all in python level. So some reference is still >> intact after function is finished. >> >> >> 2012. május 10., csütörtök 21:53:06 UTC+2 időpontban Richard a következőt >> írta: >>> >>> Ok, you don't need it to works all the time. >>> >>> Did you get it to update your records? >>> >>> If not, and if as you said it is a one trip, you can just treat the >>> whole records batch by batch... >>> >>> Look here : http://web2py.com/books/**default/chapter/29/14#** >>> Populating-database-with-**dummy-data<http://web2py.com/books/default/chapter/29/14#Populating-database-with-dummy-data> >>> >>> for i in range(10): >>> >>> populate(db.mytable,100) >>> >>> db.commit() >>> >>> >>> In this example only 100 records are populated at a time between >>> db.commit()... So maybe you just have to wrap for loop that will >>> db.commit() a couples of time during your processing. >>> >>> Richard >>> >>> >>> On Thu, May 10, 2012 at 3:32 PM, szimszon <szims...@gmail.com> wrote: >>> >>>> I had to store files and a lot of properties for it. It was in csv. But >>>> after I processed it we figured out that not all value was correct in csv >>>> but it was a bit redundant. So I can correct it by go through all the >>>> records row by row. So that was a one time trip. >>>> >>>> I just realized after the process I had no memory left. So now I'm >>>> investigating what happened... >>>> >>>> 2012. május 10., csütörtök 21:00:05 UTC+2 időpontban Richard a >>>> következőt írta: >>>>> >>>>> Yes but in this case it is not for the entire reecords... >>>>> >>>>> Why would you return a full list of all the records? >>>>> >>>>> I don't understand what is the purpose of listar that you return in >>>>> the view under a html table, why do you need to return all the 100000+ >>>>> entries? >>>>> >>>>> Richard >>>>> >>>>> On Thu, May 10, 2012 at 2:56 PM, szimszon <szims...@gmail.com> wrote: >>>>> >>>>>> In book it is a recommended way to iterate over sql results: >>>>>> >>>>>> http://web2py.com/books/**defaul**t/chapter/29/6<http://web2py.com/books/default/chapter/29/6> >>>>>> >>>>>> You can do all the steps in one statement: >>>>>> >>>>>> 1. >>>>>> 2. >>>>>> 3. >>>>>> >>>>>> >>> for row in db(db.person.name=='Alex').sel****ect(): >>>>>> >>>>>> >>>>>> print row.name >>>>>> >>>>>> Alex >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> 2012. május 10., csütörtök 20:42:22 UTC+2 időpontban Bruce Wade a >>>>>> következőt írta: >>>>>> >>>>>>> Sorry, you really need to read more about how python works. If you >>>>>>> learn how for loops work and memory you will understand the problem. >>>>>>> >>>>>>> One solution do the query before the for loop then loop through the >>>>>>> objects. This may help at bit. Research xrange vs range >>>>>>> >>>>>>> >>>>>>> On Thu, May 10, 2012 at 11:30 AM, szimszon <szims...@gmail.com>wrote: >>>>>>> >>>>>>>> Sorry I don't understand. What do you mean "achieve with join"? >>>>>>>> >>>>>>>> There is an empty for loop with db.executesql() without join. And >>>>>>>> it is eating up the memory. :( >>>>>>>> >>>>>>>> 2012. május 10., csütörtök 19:12:30 UTC+2 időpontban Richard a >>>>>>>> következőt írta: >>>>>>>> >>>>>>>>> You can't manage what you want to achieve with join? >>>>>>>>> >>>>>>>>> Richard >>>>>>>>> >>>>>>>>> On Thu, May 10, 2012 at 10:48 AM, szimszon <szims...@gmail.com>wrote: >>>>>>>>> >>>>>>>>>> Sorry for my dumbness but if something is wrong with my code >>>>>>>>>> please point me the right line. I'm not so good in English if it >>>>>>>>>> comes to >>>>>>>>>> "object instance count" and so. Yeah I know I should go and do some >>>>>>>>>> milkmaid job :) but I'm curious. >>>>>>>>>> >>>>>>>>>> I'm just define some variable: >>>>>>>>>> >>>>>>>>>> lista = list() >>>>>>>>>> last_row = None >>>>>>>>>> next_page_number = 0 >>>>>>>>>> >>>>>>>>>> Go in a for loop that just assign the db query result one-by-one >>>>>>>>>> to row variable. >>>>>>>>>> >>>>>>>>>> After that I assign the TABLE() helper to a list variable. That >>>>>>>>>> is it. >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> 2012. május 10., csütörtök 16:34:49 UTC+2 időpontban Bruce Wade a >>>>>>>>>> következőt írta: >>>>>>>>>> >>>>>>>>>>> Using direct sql query or DAL is going to cause the exact same >>>>>>>>>>> problem in this situation. >>>>>>>>>>> >>>>>>>>>>> On Thu, May 10, 2012 at 7:28 AM, szimszon <szims...@gmail.com>wrote: >>>>>>>>>>> >>>>>>>>>>>> It's postgres:// in a >>>>>>>>>>>> Version 1.99.7 (2012-04-23 11:26:23) dev of web2py, and >>>>>>>>>>>> >>>>>>>>>>>> Python 2.7.3 (default, Apr 20 2012, 22:44:07) >>>>>>>>>>>> [GCC 4.6.3] on linux2 >>>>>>>>>>>> >>>>>>>>>>>> python-psycopg2 2.4.5-1 >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> 2012. május 10., csütörtök 15:40:36 UTC+2 időpontban >>>>>>>>>>>> rochacbruno a következőt írta: >>>>>>>>>>>> >>>>>>>>>>>>> Just for curiosity, what happens if you do it in pure sql? >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> for row in db.executesql("**sele**********ct * from >>>>>>>>>>>>> file_properties where id > 0"): >>>>>>>>>>>>> >>>>>>>>>>>>> # do something >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> Does it have a lower memory usage? >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> On Thu, May 10, 2012 at 4:14 AM, Bruce Wade >>>>>>>>>>>>> <<bruce.w...@gmail.com> >>>>>>>>>>>>> > wrote: >>>>>>>>>>>>> >>>>>>>>>>>>>> for row in db( db.file_**propert**********ies.id > 0 ).select >>>>>>>>>>>>>> ( >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> -- >>>>>>>>>>>>> >>>>>>>>>>>>> Bruno Rocha >>>>>>>>>>>>> [http://rochacbruno.com.br] >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> -- >>>>>>>>>>> -- >>>>>>>>>>> Regards, >>>>>>>>>>> Bruce Wade >>>>>>>>>>> http://ca.linkedin.com/in/**bruc********elwade<http://ca.linkedin.com/in/brucelwade> >>>>>>>>>>> http://www.wadecybertech.com >>>>>>>>>>> http://www.fittraineronline.**co********m<http://www.fittraineronline.com>- >>>>>>>>>>> Fitness Personal Trainers Online >>>>>>>>>>> http://www.warplydesigned.com >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>> >>>>>>> >>>>>>> >>>>>>> -- >>>>>>> -- >>>>>>> Regards, >>>>>>> Bruce Wade >>>>>>> http://ca.linkedin.com/in/**bruc****elwade<http://ca.linkedin.com/in/brucelwade> >>>>>>> http://www.wadecybertech.com >>>>>>> http://www.fittraineronline.**co****m<http://www.fittraineronline.com>- >>>>>>> Fitness Personal Trainers Online >>>>>>> http://www.warplydesigned.com >>>>>>> >>>>>>> >>>>> >>> -- http://www.tecnodoc.com.ar