Weitere mögliche Speicherlecks
Ich vermute die in babsimHospital()
erzeugte Trajektorie sammelt alle in babsimHospital()
enthaltenen Objekte, also insbesondere conf
, para
und arrivalTimes
, ein.
Warum? Weil wir in simFun()
in babsimHospital()
Funktionen an simmer::timeout()
übergeben, die in babsimHospital()
definiert sind. Siehe z.B. hier. D.h. wir können über die parent.env()
der Funktion immer zurück in babsimHospital()
schauen und R kann all den Müll nicht wegräumen.
Folgendes Beispiel verdeutlicht das Problem:
makeNormalGenerator <- function(mean, sd, add_trash=FALSE) {
if (add_trash)
trash <- runif(10000000)
function() {rnorm(1, mean, sd)}
}
for (add_trash in c(TRUE, FALSE)) {
message("## Generator ", ifelse(add_trash, "mit", "ohne"), " Müll drin.")
g <- makeNormalGenerator(0, 1, add_trash)
message("# Inhalt der environment von g:")
ls(env=environment(g))
message("# Speicherverbrauch nach einem GC:")
print(gc(full=TRUE))
}