2015-09-05 30 views
5

Khi sử dụng thư viện Haskell HDBC-ODBC để kết nối với Microsoft SQL Server, tôi đang gặp sự cố rò rỉ bộ nhớ kém.Haskell HDBC-ODBC Rò rỉ bộ nhớ?

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 

Chạy trình tạo heap giúp tôi sử dụng bộ nhớ liên tục nhưng Window báo cáo tăng đến gần 100MB sử dụng.

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

Đối với tôi điều này dường như rò rỉ bộ nhớ là trong giao diện chức năng nước ngoài của các trình điều khiển ODBC, nhưng đây là lần đầu tiên tôi profiling mã vì vậy tôi không thể chắc chắn. Có ai có bất kỳ cái nhìn sâu sắc hơn hoặc gợi ý cho một sửa chữa? Gọi System.Mem.performGC trong vòng lặp để thử và làm sạch không có hiệu lực.

Có cách nào khác để sử dụng HDBC-ODBC không? Nếu không, tôi có thể cần phải học F #.

+0

Đoán tùy ý: việc xóa 'commit c' có tạo sự khác biệt không? – duplode

+0

Không, cam kết c không tạo nên sự khác biệt nào cả. Cũng sử dụng một quickQuery 'thay vì getTables gây ra sự rò rỉ bộ nhớ tương tự. –

Trả lời

1

Sự cố nằm trong thư viện hdbc-odbc. Một phiên bản mới v2.5 có sẵn từ repo Git nhưng thư viện hdbc cũng cần phải được vá để làm việc.

Chi tiết khác có tại this bug report.