Here is the output in python2:
NEURON -- Release 7.3 (980:01f9410e41bc) 2013-10-31
Duke, Yale, and the BlueBrain Project -- Copyright 1984-2013
See http://www.neuron.yale.edu/neuron/credits
Python version 2.7.3
memory 21.504
memory 22.032
memory 22.032
memory 22.032
memory 22.032
memory 22.032
memory 22.032
memory 22.032
memory 22.032
memory 22.032
all done
and in python3:
NEURON -- Release 7.3 (980:01f9410e41bc) 2013-10-31
Duke, Yale, and the BlueBrain Project -- Copyright 1984-2013
See http://www.neuron.yale.edu/neuron/credits
Python version 3.3.3
memory 55.464
memory 87.408
memory 118.56
memory 149.976
memory 181.392
memory 212.808
memory 244.224
memory 275.64
memory 307.056
memory 338.472
all done
Here is the code:
Code: Select all
# -*- coding: utf-8 -*-
"""
demonstrate py3 memory leak
Use ranstream from Brette et al 2007
"""
from __future__ import print_function
from __future__ import division
import resource
import sys
from neuron import h
h.load_file("ranstream.hoc") # load the randomstream object
class Test():
"""
simple list of ranstreams
"""
def __init__(self, N=1000):
self.N = N
self.ran_list = list()
for i in range(self.N):
self.ran_list.append(h.RandomStream(i))
self.use_streams()
def use_streams(self):
"""
pick some random numbers from each stream
"""
h.mcell_ran4_init(1)
for rs in self.ran_list:
rs.start()
rs.r.uniform(0, 1)
for i in range(self.N):
rs.repick()
if __name__ == '__main__':
print('Python version', sys.version.split()[0])
for i in range(10):
net = Test()
mem = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss/1000
print('memory', mem)
print("all done")
Code: Select all
// random_stream_offset_ = 1000
// to match the statement in Brette /commmon/init.hoc
random_stream_offset_ = 500
begintemplate RandomStream
public r, repick, start, stream
external random_stream_offset_
objref r
proc init() {
stream = $1
r = new Random()
start()
}
func start() {
return r.MCellRan4(stream*random_stream_offset_ + 1)
}
func repick() {
return r.repick()
}
endtemplate RandomStream