[pypy-dev] Fatal RPython error: MemoryError

Roger Flores aidembb at yahoo.com
Tue Aug 7 07:41:05 CEST 2012


I'm still getting MemoryError exceptions in RPython, as I mentioned a few months back.  I only knew of one way to reproduce it back then, but now I'm seeing different ways.  So, inspired, I wrote a short program to quickly exhaust memory in the hopes of reproducing the problem.  It seems to work! Fast!


If you run the code pasted at the bottom with CPython, it should end printing 'test passed'.
If you run the code with pypy 1.9 (I tried Windows), you should get:


RPython traceback:
  File "translator_goal_targetpypystandalone.c", line 1048, in entry_point
  File "interpreter_function.c", line 929, in funccall__star_1
  File "interpreter_function.c", line 958, in funccall__star_1
  File "rpython_memory_gc_minimark.c", line 2518, in MiniMarkGC_collect_and_rese
rve
  File "rpython_memory_gc_minimark.c", line 2220, in MiniMarkGC_minor_collection

  File "rpython_memory_gc_minimark.c", line 4258, in MiniMarkGC_collect_oldrefs_
to_nursery
  File "rpython_memory_gc_base.c", line 1799, in trace___trace_drag_out
  File "rpython_memory_gc_minimark.c", line 6667, in MiniMarkGC__malloc_out_of_n
ursery_nonsmall
Fatal RPython error: MemoryError


Can someone else at least confirm this?

Thanks,

-Roger Flores


exhaust-mem.py:

"""
Code to exhaust memory and generate a MemoryError exception
"""

size = 1

# find the largest memory allocation that succeeds
try:
    while True:
        new_size = size * 2
        d = [0] * size
        size = new_size
    
except MemoryError as msg:
    pass


l = []

# exhaust memory
while True:
    try:
        # add the allocations to a list so references to them remain.
        # otherwise the garbage collector will clean them out!
        l.append([0] * size)
        print '{:,}'.format(size)
    
    except MemoryError as msg:
        if size > 1:
            # can't allocate this much memory anymore.  Try a smaller size
            size = size / 2
        else:
            print 'test passed'
            break


More information about the pypy-dev mailing list