Loading Packages in a loop
- To: mathgroup at smc.vnet.net
- Subject: [mg84440] Loading Packages in a loop
- From: "Matthias Gottschalk" <mgott at gfz-potsdam.de>
- Date: Mon, 24 Dec 2007 04:48:28 -0500 (EST)
I do heavy calculations repeatedly in a loop using
Mathematica 6.0.1.0
For this I use a package which I load.
For each pass in the loop the Kernel memory requirements
increases my 50 to 100 MB. Because of this the
calculations fail after several passes through the loop.
I came across the CleanSlate package which in principal
does what I want. It works and frees the memory.
But I can use CleanSlate only in linear code. In any block
(loop or blocks with labels and gotos) my calculations
fail because I can not reload the package successfully.
The call to CleanSlateExcept[Global`] naturally kills the
package but I can not reload the package from inside the
loop. The call to Needs[mypackage`] runs but my functions
are not accessible.
My code looks like this:
<< CleanSlate.m;
Needs["myPackage`"];
Do[
$HistoryLength = 0; (* some other things to save memory
*)
Unprotect[In, Out]; (* some other things to save memory
*)
Clear[In, Out]; (* some other things to save memory
*)
Protect[In, Out]; (* some other things to save memory
*)
PackageFunktion[]; (* call my function *)
CleanSlateExcept["Global`"]; (* clean my context *)
Needs["myPackage`"], (* reload my package *)
{i,n}
];
The first run through the loops works, the second fails in
the respect that the PackageFunktion[] is nor more found
by the code.
I assume that this is some Context problem.
An other version of my code:
<< CleanSlate.m;
Do[
Needs["myPackage`"]; (* load my package inside the loop
*)
$HistoryLength = 0;
Unprotect[In, Out];
Clear[In, Out];
Protect[In, Out];
PackageFunktion[];
CleanSlateExcept["Global`"],
{i,n}
];
in which I call the package from within the loop produces
the following error message and no function can be called:
PackageFunktion::shdw: "Symbol PackageFunktion appears in
multiple contexts {myPackage`,Global`} definitions in
context myPackage` may shadow or be shadowed by other
definitions."
Has somebody some an idea how I can call a package from
within a loop?
Can I avoid the "memory leak" of the Kernel by other
means?
Matthias