I run Python 2.7 on a Linux machine with 16GB Ram and 64 bit OS. A python script I wrote can load too much data into memory, which slows the machine down to the point where I cannot even kill the process any more.
While I can limit memory by calling:
ulimit -v 12000000
in my shell before running the script, I'd like to include a limiting option in the script itself. Everywhere I looked, the resource
module is cited as having the same power as ulimit
. But calling:
import resource
_, hard = resource.getrlimit(resource.RLIMIT_DATA)
resource.setrlimit(resource.RLIMIT_DATA, (12000, hard))
at the beginning of my script does absolutely nothing. Even setting the value as low as 12000 never crashed the process. I tried the same with RLIMIT_STACK
, as well with the same result. Curiously, calling:
import subprocess
subprocess.call('ulimit -v 12000', shell=True)
does nothing as well.
What am I doing wrong? I couldn't find any actual usage examples online.
edit: For anyone who is curious, using subprocess.call
doesn't work because it creates a (surprise, surprise!) new process, which is independent of the one the current python program runs in.
resource.RLIMIT_VMEM
is the resource corresponding toulimit -v
.RLIMIT_DATA
only affectsbrk/sbrk
system calls while newer memory managers tend to usemmap
instead.The second thing to note is that
ulimit
/setrlimit
only affects the current process and its future children.Regarding the
AttributeError: 'module' object has no attribute 'RLIMIT_VMEM'
message: theresource
module docs mention this possibility:According to the
bash
ulimit
source linked to above, it usesRLIMIT_AS
ifRLIMIT_VMEM
is not defined.