How to free memory allocated via double[][] using dmd-2.0.12?
Markus Dittirich
markusle at gmail.com
Tue Apr 8 16:50:37 PDT 2008
Bill Baxter Wrote:
>
> Markus, you do not show us what either read_data or process_data do.
> It is possible that one of those is somehow holding on to references to
> the data. This would prevent the GC from collecting the memory.
>
> Another problem is if you allocate the memory initially as void[] then
> the GC will scan it for pointers, and in a big float buffer you'll get a
> lot of false hits. To prevent that, allocate the buffer initially as
> byte[] (or double[] --- just not void).
>
> Anyway, if you want a speedy fix, you'll need to distill this down into
> something that is actually reproducible by Walter.
>
> --bb
Hi Bill,
You're of course absolutely correct! Below is a proof of concept code
that still exhibits the issue I was describing. The parse code needs
to handle row centric ascii data with a variable number of columns.
The file "data_random.dat" contains a single row of random integers.
After a few iterations the code runs out of memory on my machine
and no deleting seems to help.
import std.stream;
import std.stdio;
import std.contracts;
import std.gc;
public double[][] parse(BufferedFile inputFile)
{
double[][] array;
foreach(char[] line; inputFile)
{
double[] temp;
foreach(string item; std.string.split(assumeUnique(line)))
{
temp ~= std.string.atof(item);
}
array ~= temp;
}
/* rewind for next round */
inputFile.seekSet(0);
return array;
}
int main()
{
BufferedFile inputFile = new BufferedFile("data_random.dat");
while(1)
{
double[][] foo = parse(inputFile);
}
return 1;
}
Thanks much,
Markus
More information about the Digitalmars-d-learn
mailing list