【发布时间】:2018-08-19 04:59:38
【问题描述】:
我正在构建一个需要大量值集合来计算答案的 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时会被释放?
【问题讨论】:
-
你必须展示你的代码,至少是其中的一部分。我们不能在不知道你在做什么的情况下说你做错了什么。更好的是,构建一个最小的可重现示例。
标签: f# garbage-collection suave