Estoy implementando algunos algoritmos que funcionan en datos grandes (~ 250 MB - 1 GB). Para esto, necesitaba un ciclo para hacer algunos benchmarking. Sin embargo, en el proceso, me doy cuenta de que F # está haciendo cosas desagradables, que espero que algunos de ustedes puedan aclarar.Compilador F # mantiene vivos los objetos muertos
Aquí está mi código (descripción del problema se encuentra por debajo):
open System
for i = 1 to 10 do
Array2D.zeroCreate 10000 10000 |> ignore
printfn "%d" (GC.GetTotalMemory(true))
Array2D.zeroCreate 10000 10000 |> ignore
// should force a garbage collection, and GC.Collect() doesn't help either
printfn "%d" (GC.GetTotalMemory(true))
Array2D.zeroCreate 10000 10000 |> ignore
printfn "%d" (GC.GetTotalMemory(true))
Array2D.zeroCreate 10000 10000 |> ignore
printfn "%d" (GC.GetTotalMemory(true))
Array2D.zeroCreate 10000 10000 |> ignore
printfn "%d" (GC.GetTotalMemory(true))
Console.ReadLine() |> ignore
Aquí la salida será como:
54000
54000
54000
54000
54000
54000
54000
54000
54000
54000
400000000
800000000
1200000000
Out of memory exception
Así, en el circuito de F # descarta el resultado, pero cuando No estoy al corriente F # guardará referencias a "datos muertos" (he buscado en el IL, y aparentemente el programa de la clase obtiene campos para estos datos). ¿Por qué? ¿Y puedo arreglar eso?
Este código se ejecuta fuera de Visual Studio y en modo de lanzamiento.
+1 Gracias, interesante :) La primera solución funciona, pero ignorar ignorar no ayudó aquí. Todavía estoy interesado en descubrir por qué hace lo que hace, sin embargo. –
Interesante ... Me ayudó cuando probé con la opción '-O' (para habilitar optimizaciones). –
Extraño. Funcionó aquí también cuando lo ejecuté fuera de Visual Studio. Sin embargo, ahora el bucle dio como resultado una excepción de falta de memoria, pero SÓLO si primero había ejecutado la versión "sin bucle":/Supongo que me limitaré al alcance local. –