memory error

Benjamin Niemann b.niemann at betternet.de
Wed Jun 2 09:52:48 EDT 2004


Bart Nessux wrote:
> def windows():
>    import os
>    excludes = ['hiberfil.sys', 'ipnathlp.dll', 'helpctr.exe', 'etc', 
> 'etc', 'etc']
>    size_list = []
>    for root, dirs, files in os.walk('/'):
>       total = [x for x in files if x not in excludes]
>       for t in total:
>          s = file(os.path.join(root,t))
>          size = s.read()
>          size_list.append(size)
>          s.close()
> 
> windows()
> 
> The above function crashes with a memory error on Windows XP Pro at the 
> 'size = s.read()' line. Page File usage (normally ~120 MB) will rise to 
> 300+ MB and pythonw.exe will consume about 200 MB of actual ram right 
> before the crash. The machine has 512 MB of ram and is doing nothing 
> else while running the script.
> 
> I've written the script several ways, all with the same result. I've 
> noticed that a binary read 'rb' consumes almost twice as much physical 
> memory and causes the crash to happen quicker, but that's about it.
> 
> Initially, I wanted to use Python to open every file on the system (that 
> could be opened) and read the contents so I'd know the size of the file 
> and then add all of the reads to a list that I'd sum up. Basically 
> attempt to add up all bytes on the machine's disk drive.
> 
> Any ideas on what I'm doing wrong or suggestions on how to do this 
> differently?
Your building an array containing the *contents* of all your files.
If you really need to use read(), use "size = len(s.read())", but this 
still requires to read and hold a complete file at a time in memory (and 
probably chokes when it stumbles over your divx collection ;)
I think using os.stat() should be better...



More information about the Python-list mailing list