Dear All:
I am writing a program that include a main loop written in Ocaml and a sub-module written in C. The main loop called the sub-module a lot, and a huge array is returned from each call.
So I use the standard C-Caml interface to return these huge data as shown below:
extern "C" value minisat_save_proof(value unit) {
CAMLparam0();
CAMLlocal1( ml_data );
vec<long>& vi=(solver->proof)->save("minisat_save_proof");
int sz=vi.size();
ml_data = caml_alloc (sz,0);
for (int i=0;i<sz;i++) {
Store_field( ml_data, i, Val_int((int)(vi[i])) );
}
CAMLreturn( ml_data );
}
In the main ocaml program loop, there is a call to a ocaml method A, which again call this C method minisat_save_proof.
When ocaml method A got these data returned from minisat_save_proof, it call another method B to clear all data structure in the sub-module written in C, and then exit to the main loop and call Gc.compress to collect all garbage.
So in this case I think the memory usage of my program should be the same like before calling minisat_save_proof , because the returned data should be collected by the garbage collector when exiting the method A to the main loop.
But from the unix "top" command, I find that these huge return data seems to remain in memory and consume all my memory step by step.
So I want to know if there is any method to free these data?