[Tutor] Memory Management etc

Philip Smith philipasmith at blueyonder.co.uk
Fri May 5 08:30:02 CEST 2006


Hi

Thanks for response.

I'm pretty sure for one reason and another that hardware is not at fault.

I use the windows monitor to track memory usage.  I must say I hadn't 
realised that Python doesn't release memory back to the OS - someone else 
advised me to try the alpha 2.5 version which cures this problem - I have 
but regretably the same problem keeps occurring.

The programme is about 600 lines and I'd be loth to let anyone have it in 
its current form until I understand this problem.

Interestingly I have programmed this in 3 different ways - as a class, as a 
modular programme and (currently) as a single file application (using global 
variables instead of parameter passing purely because in some cases I was 
passing and returning up to 20 parameters which seemed clumsy).

I have profiled the programme to death and there is no doubt that using 
globals is faster (this is a time-critical application).  However I may 
translate the current version back into modular or class form and see if the 
problem vanishes.

Regards

Phil

----- Original Message ----- 
From: "Danny Yoo" <dyoo at hkn.eecs.berkeley.edu>
To: "Philip Smith" <philipasmith at blueyonder.co.uk>
Cc: <tutor at python.org>
Sent: Thursday, May 04, 2006 6:31 PM
Subject: Re: [Tutor] Memory Management etc


>> I have a problem with a large programme that uses a lot of memory 
>> (numerous large arrays which are dynamically extended).  I keep getting 
>> unpredictable crashes (on a machine with 1/2 GB memory) whereas on my 
>> laptop (1 GB memory) it seems OK.
>
> Hi Philip,
>
> Can you be more specific about what you mean by "crash"?  Does the whole 
> operating system freeze, or do you get an error message from Python, or 
> ...?
>
> The reason I ask is because what you see may not necessarily have to do 
> with Python --- there may be lower-level issues such as physical hardware, 
> for example.  So more information on symptoms will be very helpful.
>
>
>> There are no debugger messages it just crashes (and reboots the machine 
>> more often than not).
>
> Ok, if I understand what you're saying: are you saying that the machine 
> physically reboots without user prompting?  If so, that's almost certainly 
> NOT Python then.  System reboot means that even your operating system is 
> having difficulty keeping the machine usable.  The most likely explanation 
> in this circumstance is that the physical hardware is defective.
>
> I'd recommend running diagnostics like a RAM checker.  But try running 
> your program on another machine as another data point to support the 
> possibility that perhaps the hardware, and not the software is the issue.
>
>
>> I have to say I have noticed (the programme is basically a 
>> batch-factoring programme for integers) that no matter how I tune gc I 
>> can't get it to reliably free memory in between factoring each integer.
>
> How are you measuring this?
>
> Note that Python does not necessarily give allocated memory back to the 
> operating system: it keeps a memory pool that it reuses for performance 
> reasons.
>
> Is the amount of memory you're using at least bounded?
>
>
>> Because this is a development programme (and for performance reasons) I 
>> use global variables some of which refer to the large arrays.
>
> Global variables don't necessarily make programs fast.  I would strongly 
> discourage this kind of ad-hoc performance optimization.  Don't guess: let 
> the machine tell you where the program is slow. If you really want to make 
> your program fast, use a profiler.
>
> Also note that parameter passing from one function to another is a 
> constant-time operation: no object values are being copied.  So the cost 
> assumptions you're making about passing large arrays around functions may 
> not be correct.
>
>
>
>> 1)  Does the mere fact that a function cites a variable as global create 
>> a reference which prevents it being collected by gc?
>
> This isn't a contributing factor.  But global variable values at the 
> toplevel don't die: that's the point about global variables, because they 
> always have at least one reference to them and they're always accessible 
> to the outside.
>
>
>> 3)  Is there any way to allocate a pool of available memory to my 
>> programme at the outset from which I can allocate my large arrays?
>
> Practially everything in Python is done at runtime, not compile time.  At 
> program startup, I suppose you can preallocate some arrays and keep a pool 
> of them for your usage.
>
> But are you finding this to be a significant factor in your program, 
> though?  Again, before you go ahead with optimization, I'd strongly 
> recommend using a profiler to do a principled analysis of the hotspots of 
> your program.  Have you looked at the Python Profiler yet?
>
>
>
>> I'm keen to solve this because I would like to make my programme 
>> generally available - in every other respect its near complete and 
>> massively outperforms the only other comparable pure python module 
>> (nzmath) which does the same job.
>
> If you would like a code review, and if the program is short enough, I'm 
> sure people here would be happy to give some pointers.
>
> Good luck to you!
> 




More information about the Tutor mailing list