I am implementing a online judge in python. The judge is to run on a UNIX machine. To enforce memory limits I am using ulimit and to run a program I am using subprocess.Popen() . I want to calculate the exact memory usage. How can I do so?
| # | User | Rating |
|---|---|---|
| 1 | Benq | 3676 |
| 2 | Kevin114514 | 3657 |
| 3 | jiangly | 3638 |
| 4 | turmax | 3442 |
| 5 | tourist | 3380 |
| 6 | Um_nik | 3353 |
| 7 | strapple | 3350 |
| 8 | squareOf105 | 3346 |
| 9 | heuristica | 3322 |
| 10 | maroonrk | 3310 |
| # | User | Contrib. |
|---|---|---|
| 1 | Qingyu | 158 |
| 2 | nik_exists | 151 |
| 3 | maspy | 150 |
| 4 | AmShZ | 144 |
| 4 | Um_nik | 144 |
| 6 | Errichto | 139 |
| 7 | adamant | 137 |
| 8 | BledDest | 135 |
| 9 | maroonrk | 133 |
| 10 | Proof_by_QED | 131 |
I am implementing a online judge in python. The judge is to run on a UNIX machine. To enforce memory limits I am using ulimit and to run a program I am using subprocess.Popen() . I want to calculate the exact memory usage. How can I do so?
| Name |
|---|



Use
resource.getrusage():http://docs.python.org/3/library/resource.html#resource.getrusage
The maximum used memory is
ru_maxrss.I used ~~~~~
p = subprocess.Popen(cmd, shell=True,stdout=subprocess.PIPE, stderr=subprocess.PIPE)print getrusage(resource.RUSAGE_CHILDREN).ru_maxrss~~~~~but the output is always zero am I doing something wrong. cmd is the command to be executed.
You need to wait for the child first: http://pubs.opengroup.org/onlinepubs/9699919799/functions/getrusage.html
Okay.. Now I am using
~~~~~
But still I am getting about the same value(~3430) for any program that I am executing. But the programs: https://ideone.com/KK1rak and http://ideone.com/3HfV9f take different memory according to ideone.
That is because you measure maxrss of the shell process and not of your program. You have to use
shell=False.Also, it seems that resource usage is cumulative, so if you want to run multiple programs and obtain individual data about them, you'd have to fork a Python process for each time.
I changed to this.
with open('in.txt','r') as infile, open('out.txt', 'w') as outfile:`p=subprocess.check_call("./"+cmd,shell=False,stdin=infile,stdout = outfile, stderr = subprocess.PIPE)`Res= getrusage(resource.RUSAGE_CHILDREN)print Res.ru_maxrssStill I am getting a constant value(~5060).
Now it seems you forgot the wait... This works for me:
EDIT: I did not notice you changed
Popentocheck_call, it will wait for the process indeed.Maybe you could take a look at this opensource online judge (written in Python) and see how they do it :)