所以,我已经使用了几个
Haskell
XML库,包括hexpat和xml-enumerator.在阅读了真实世界Haskell(http://book.realworldhaskell.org/read/io.html)中的IO章节之后,我的印象是,如果我运行以下代码,那么在我浏览它时它将被垃圾收集.
但是,当我在一个大文件上运行时,内存使用量会随着运行而不断攀升.
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
我是hexpat的维护者.这是一个错误,我现在已经修复了hexpat-0.19.8.谢谢你引起我的注意.
这个bug在ghc-7.2.1上是新的,它与我在绑定到三元组的where子句和unsafePerformIO之间没有预料到的交互有关,我需要使它与C代码的交互看起来很纯粹.哈斯克尔.
原文地址:https://www.jb51.cc/xml/292073.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。