2015-09-05 14 views
5

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 #.

+0

Indovina arbitraria: la rimozione del 'commit c' fa la differenza? – duplode

+0

No, il commit c non fa alcuna differenza. Anche l'uso di una quickQuery 'invece di getTables causa la stessa perdita di memoria. –

risposta

1

Il problema era nella libreria hdbc-odbc. Una nuova versione v2.5 è disponibile dal repository Git, ma anche la libreria hdbc deve essere modificata per funzionare.

Maggiori dettagli disponibili a this bug report.