【问题标题】:Haskell HDBC-ODBC Memory Leak?Haskell HDBC-ODBC 内存泄漏?
【发布时间】:2015-09-05 02:08:16
【问题描述】:

当使用 Haskell HDBC-ODBC 库连接到 Microsoft SQL Server 时,我遇到了严重的内存泄漏。

import           Database.HDBC        
import qualified Database.HDBC.ODBC   as ODBC
import           Control.Monad

-- | Main application.
main :: IO ()
main = dbTest

dbTest :: IO ()
dbTest = do
    let connStr = "DSN=TESTDB;Uid=sa;Pwd=password"
    conn <- ODBC.connectODBC connStr
    replicateM_ 20000 (loop conn)
    disconnect conn
  where
    loop c = do
        result <- getTables c
        commit c
        putStrLn $ show result

运行堆分析器使我的内存使用量保持不变,但 Window 报告内存使用量增加到近 100MB。

http://i.stack.imgur.com/YkUTW.png

对我来说,这似乎是 ODBC 驱动程序的 Foreign Function 接口中的内存泄漏,但这是我第一次分析代码,所以我不能确定。有没有人对修复有任何进一步的见解或建议?在循环中调用 System.Mem.performGC 尝试清理没有效果。

除了使用 HDBC-ODBC 之外,还有其他选择吗?如果没有,我可能需要学习 F#。

【问题讨论】:

  • 任意猜测:删除commit c 有影响吗?
  • 不,提交 c 根本没有任何区别。同样使用 quickQuery' 而不是 getTables 会导致相同的内存泄漏。

标签: haskell memory memory-leaks


【解决方案1】:

问题出在 hdbc-odbc 库中。 Git repo 提供了新版本 v2.5,但 hdbc 库也需要修补才能正常工作。

更多详情请访问this bug report

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-24
    • 1970-01-01
    • 1970-01-01
    • 2014-01-18
    • 2019-09-25
    • 2023-03-29
    • 1970-01-01
    相关资源
    最近更新 更多