Sto facendo un punto di riferimento per mergesort e quicksort.Cosa devo fare per consentire a GC di liberare la memoria non utilizzata in OCaml?
Ho implementato Random_list.create
, Mergesort.sort_list
e Quicksort.sort_list
. Possiamo supporre che le tre funzioni siano correttamente implementate e che le implementazioni non siano importanti in questa domanda.
Quello che voglio chiedere riguarda OCaml's GC.
Ecco il mio codice di riferimento:
let _ =
let l = Random_list.create 10000000 in
let len1 = List.length (Mergesort.sort_list l) in
Printf.printf "mergesort done for %d elements" len1;
let len2 = List.length (Quicksort.sort_list l) in
Printf.printf "quicksort done for %d elements" len2
Se faccio funzionare il codice di cui sopra, che mi dice Fatal error: exception Out_of_memory
dopo mergesort done for 10000000 elements
.
Ha esaurito la memoria, nessun problema. anche l'output mi dice Out_of_memory
si è verificato dopo il successo mergesort
.
Poi quello che ho fatto contempla il codice e di test separatamente:
let _ =
let l = Random_list.create 10000000 in
let len1 = List.length (Mergesort.sort_list l) in
Printf.printf "mergesort done for %d elements" len1
e poi
let _ =
let l = Random_list.create 10000000 in
let len2 = List.length (Quicksort.sort_list l) in
Printf.printf "quicksort done for %d elements" len2
Sia funziona bene senzaOut_of_memory
.
Ecco la mia domanda:
dal mio codice di riferimento, Sì, ho fatto i tipi di serie: Mergesort e poi Quicksort.
Durante l'esecuzione, dovrebbero essere creati 3 elenchi principali: l
e l'elenco da un fusore e l'elenco da quicksort.
Tuttavia, l'elenco creato da mergesort deve essere GCed
prima di quicksort, giusto? e quella lista non ha alcun riferimento ad essa, giusto?
Prima di quicksort, c'è solo un elenco principale che è l'originale l
, giusto?
Perché genera ancora l'errore Out_of_memory
?
Sarebbe bene avere un 'Gc.print_stat stdout' solo per verificare cosa succede dopo ogni ordinamento e creazione di liste. – snf
+1 per il suggerimento sopra. Inoltre, tangenzialmente correlati, per comprendere meglio il consumo di memoria, potresti trovare utile il seguente piccolo modulo: http://ygrek.org.ua/p/code/measure.ml – ygrek