Vì vậy, tôi đã chơi xung quanh với một số thư viện XML Haskell, bao gồm cả hexpat và xml-enumerator. Sau khi đọc chương IO trong thế giới thực Haskell (http://book.realworldhaskell.org/read/io.html) Tôi đã bị ấn tượng rằng nếu tôi chạy đoạn mã sau, nó sẽ là rác thu thập được khi tôi đi qua nó.Haskell phân tích cú pháp tệp xml lớn với bộ nhớ thấp
Tuy nhiên, khi tôi chạy trên một tệp lớn, mức sử dụng bộ nhớ tiếp tục tăng khi nó chạy.
runghc parse.hs bigfile.xml
Tôi đang làm gì sai? Giả định của tôi có sai không? Bản đồ/bộ lọc có buộc nó đánh giá mọi thứ không?
import qualified Data.ByteString.Lazy as BSL
import qualified Data.ByteString.Lazy.UTF8 as U
import Prelude hiding (readFile)
import Text.XML.Expat.SAX
import System.Environment (getArgs)
main :: IO()
main = do
args <- getArgs
contents <- BSL.readFile (head args)
-- putStrLn $ U.toString contents
let events = parse defaultParseOptions contents
mapM_ print $ map getTMSId $ filter isEvent events
isEvent :: SAXEvent String String -> Bool
isEvent (StartElement "event" as) = True
isEvent _ = False
getTMSId :: SAXEvent String String -> Maybe String
getTMSId (StartElement _ as) = lookup "TMSId" as
Mục tiêu cuối cùng của tôi là phân tích cú pháp tệp xml lớn với giao diện giống như sax đơn giản. Tôi không muốn phải nhận thức được toàn bộ cấu trúc để được thông báo rằng tôi đã tìm thấy một "sự kiện".
Bạn cũng có được hành vi này khi biên dịch nó thay vì chạy nó trong chế độ diễn giải? – hammar
Và đừng quên sử dụng tối ưu hóa (-O2) khi biên dịch. –
Bạn có phải biên dịch và tối ưu hóa để làm cho nó thu thập rác không? Nếu vậy, tôi sẽ chắc chắn để thử điều đó trong tương lai –