加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Haskell解析内存不足的大xml文件

发布时间:2020-12-16 23:49:50 所属栏目:百科 来源:网络整理
导读:所以,我已经使用了几个 Haskell XML库,包括hexpat和xml-enumerator.在阅读了真实世界Haskell(http://book.realworldhaskell.org/read/io.html)中的IO章节之后,我的印象是,如果我运行以下代码,那么在我浏览它时它将被垃圾收集. 但是,当我在一个大文件上运行时
所以,我已经使用了几个 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

我的最终目标是使用简单的类似sax的界面解析一个巨大的xml文件.我不想知道整个结构,以通知我发现了一个“事件”.

我是hexpat的维护者.这是一个错误,我现在已经修复了hexpat-0.19.8.谢谢你引起我的注意.

这个bug在ghc-7.2.1上是新的,它与我在绑定到三元组的where子句和unsafePerformIO之间没有预料到的交互有关,我需要使它与C代码的交互看起来很纯粹.哈斯克尔.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读