我正在构建一个需要大量值来计算答案的 REST 后端。此集合在启动时下载,然后按需下载,但需要每天更新几次。我不知道如何应对这种可变状态。我已经在 main 函数中尝试了 ref 和 mutable 变量,但是旧集合永远不会被释放,并且内存使用量在不受控制的情况下增长。
处理这种可变状态的正确方法是什么?
编辑
在准备我正在做的事情的样本时,我发现了第一个错误。我在做:
let sqlfeed() =
use cmd = new SqlFeedType(connectionString)
Some (cmd.Execute() |> Seq.toList)
现在我正在做我正在做这样的事情:
let sqlfeed() =
Some (using (new SqlFeedType(connectionString)) (fun cmd -> cmd.Execute() |> Seq.toList))
然后
[<EntryPoint>]
let main argv =
let optionSqlFeed = ref None
let app =
choose [
Filters.path "/sqlfeed" >=> warbler (fun ctx ->
match !optionSqlFeed with
| None ->
optionSqlFeed := sqlfeed()
| Some a ->
optionSqlFeed := None
Successful.OK "done" )
]
startWebServer defaultConfig app
之前,当我调用 sqlfeed 并下载数据时,我看到内存增加了。在交替分配给 None 的连续调用中,内存不会被释放,并且总使用量只会攀升。现在,当我调用 sqlfeed 并将 None 分配给可变变量时,内存仍然没有被释放,但是在下一次调用 sqlfeed 时,内存被释放。
为什么我分配None时不会释放内存,但再次调用sqlfeed时会释放内存?