Quando si utilizza la libreria Haskell HDBC-ODBC per connettersi a un server Microsoft SQL, si verifica una perdita di memoria non valida.Perdita di memoria Haskell HDBC-ODBC?
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
L'esecuzione del profiler mucchio mi dà l'utilizzo della memoria costante, ma finestra dei rapporti di memoria aumentando a quasi 100 MB di utilizzo.
http://i.stack.imgur.com/YkUTW.png
A me questo sembra che la perdita di memoria è nell'interfaccia funzione degli Esteri del driver ODBC, ma questa è la mia prima volta il profiling del codice quindi non posso essere certo. Qualcuno ha ulteriori approfondimenti o suggerimenti per una correzione? Chiamare System.Mem.performGC nel ciclo per provare e ripulire non ha alcun effetto.
Esistono alternative all'utilizzo di HDBC-ODBC? In caso contrario, potrei aver bisogno di imparare F #.
Indovina arbitraria: la rimozione del 'commit c' fa la differenza? – duplode
No, il commit c non fa alcuna differenza. Anche l'uso di una quickQuery 'invece di getTables causa la stessa perdita di memoria. –