swarm-support
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Swarm-Support] memory problems


From: Paul E. Johnson
Subject: Re: [Swarm-Support] memory problems
Date: Wed, 04 Jun 2003 11:55:25 -0500
User-agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.4b) Gecko/20030513

The support list changed servers and is archived here now;

http://www.swarm.org/pipermail/support/

I think I had not paid attention to your previous message because it was Java related. Since we are seeing this probe-related issue (probe for doubles, I think) on the ObjC side, it makes me think the Java example you have reveals a symptom of the problem, but not the problem itself. I'm reading code trying to see why this happens. I've done this lots of times, but I keep ending up back staring at the CONVERT thing in objectbase/Probe.h. But I can't see anything wrong there. But I don't find any undropped or unfreed allocations.

All these problem usages lead back to probes of doubles. The "getDouble()" function I had which triggered the memory leak used

double ret = [probe probeAsDouble: obj];

And the EZDist usage leads back to EZBin's update method, and there we see a MessageProbe created and then, guess what, for a collection,

double v = [mp doubleDynamicCallOn: obj];

Eventually, you end up back in the same part of the forest. I tried to use some memory checkers on this a couple of months ago, but they fail to help because they think there are thousands of undropped memory items in any running swarm model.
pj




Marshall, James A R wrote:

Paul,
 just to remind you, I had a look at memory leaks to do with probes over
the last year or so and wrote some test code... could be related to
Marcello's problem:
http://www.santafe.edu/projects/swarm/archive/list-archive.0209/0072.html
 Not sure if that was the last word I had to say on the subject, as the
mailing list archives seem to be in a bit of a sorry state ... searching
doesn't work, archives after May 2002 aren't indexed, and I can't find any
of the archives for 2003.
 Hope this is of some help,
        James

---
Dr James A R Marshall
Complex Systems Modelling Group (COSMIC)
Department of Earth Science and Engineering
Imperial College London
Tel: +44 (0)20 7594 7493
Fax: +44 (0)20 7594 7444
Container World Project - http://www.ese.ic.ac.uk/research/containerworld/



-----Original Message-----
From: Paul E. Johnson [mailto:address@hidden
Sent: 04 June 2003 16:27
To: address@hidden
Subject: Re: [Swarm-Support] memory problems


THanks very much for pointing me at this problem. As I expected, it is a memory leak related to probe creation, and I'm going to keep trying to understand why it happens.

pj


Marcello wrote:

Thanks a lot for the reply. Following Paul's suggestion, I wrote a
method to make the computations I needed on the agents, so I do not need
EZDistribution anymore.
In case someone might be interested in debugging the memory leak, I have
done some experiments with EZDistribution (and EZBin as well), and the
problem does not seem to be related with dropping the object: I found
that there is a huge memory usage increase even when only *one*
EZDistribution is created, and each agent only updates it.
Specifically, I create a single instance of EZDistribution in
SwarmModel, which can be accessed by each agent via a method call. Now each agent calls the collection upon which EZDistribution operates,
the agent cleans up the collection and add new agents, updates the
distribution and forget about it. Even in this case, I can get my
program using up to 300mg in a little while.

CODE
in Swarm model (- buildObjects )

somePeople=[List create: [self getZone]];

somePeopleTab=[EZBin createBegin: [self getZone]];
[somePeopleTab setTitle: "stats"];
[somePeopleTab setGraphics:0];
[somePeopleTab setBinCount: 5];
[somePeopleTab setLowerBound: 0];
[somePeopleTab setUpperBound: 5];
[somePeopleTab setCollection: somePeople ];
[somePeopleTab setProbedSelector: M(getTypology) ];
[somePeopleTab createEnd];

//// other code

- getSomePeople {

return somePeople;
}

- getSomePeopleTab {

return somePeopleTab;
}

(In Agent.m)

id observed;
id group;

  group=[model getSomePeople];
  [group removeAll];

 //this fill up "group"
for (i=0; i<10;i++) {
while ([group contains: (observed = [self look])] ) ; [group addLast:observed];
}
[[model getSomePeopleTab] update]; //if I remove this, no memory
problem occurs. With this line, the program grows (very roughly) about
1mg for each thousand calls .


// other unrelated stuff





Thanks again
marcello




On Tue, 2003-06-03 at 20:35, Paul E Johnson wrote:


I agree that the drop on the EZDistribution object should give all the memory back, but I don't think most people have tried to use that class in this way and so, if there is a memory leak, we have not been alerted to it yet. I found a memory leak, which I still have not solved, in a method that used probes to retrieve double-valued variables, and if you are doing that, I expect you could see the same issue.

I think that you should redesign your class so that each agent only creates one EZDistribution as an instance variable and then use it over and over. There is no need to create and drop at every time.

The other (better!) possibility is you should find a better way to collect the information you want. For example, are you just trying to get a tabulation of how many agents there are in each group? If so, consider using a method like (off the top of my head, excuse typos)


suppose there is an instance variable

int tabulator[6]; //need 6 because your example shows values from 0 to 5
                 //not 5 binCount as you have;

and somewhere you initialize that to 0's

Then call a method that does the tabulation. This will be much faster than creating a big old EZDistribution.

- tabulateDistribution
{
  id index = [group begin];
  id anObject;

for (anObject=[index next]; [index getLoc == Member]; anObject=[index next])
      {
         int agentValue = [anObject getTypology];
         tabulator[agentValue]++;
       }
}


Or, if you just want to calculate an average or standard deviation, you can do that more easily with EZGraph, I can show you how if you need.

Sorry, gotta run to a meeting.




--
Paul E. Johnson                       email: address@hidden
Dept. of Political Science            http://lark.cc.ukans.edu/~pauljohn
University of Kansas                  Office: (785) 864-9086
Lawrence, Kansas 66045                FAX: (785) 864-5700




reply via email to

[Prev in Thread] Current Thread [Next in Thread]