그래서 저는 hexpat와 xml-enumerator를 포함한 여러 Haskell XML 라이브러리를 가지고 놀았습니다. Real World Haskell (http://book.realworldhaskell.org/read/io.html)의 IO 장을 읽은 후에 다음 코드를 실행하면 가비지 수집이 가능하다는 인상하에있었습니다.Haskell은 메모리가 적은 큰 xml 파일을 구문 분석합니다.
그러나 큰 파일에서 실행할 때 메모리 사용량은 계속 올라갑니다.
runghc parse.hs bigfile.xml
내가 뭘 잘못하고 있니? 내 가정이 틀렸어? 지도/필터가 모든 것을 평가하도록 강요합니까?
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
내 최종 목표는 간단한 색소폰 같은 인터페이스를 가진 거대한 XML 파일을 구문 분석하는 것입니다. 나는 "이벤트"를 발견했다는 통지를 받기 위해 전체 구조를 인식하고 싶지는 않습니다.
해석 모드에서 실행하는 대신 컴파일 할 때이 동작이 발생합니까? – hammar
컴파일 할 때 최적화 (-O2)를 사용하는 것을 잊지 마십시오. –
가비지 수집을 위해 컴파일하고 최적화해야합니까? 만약 그렇다면, 앞으로는 그것을 시도 할 것입니다. –