首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用XML -导管光标接口从大型XML文件中提取信息(约30G)

如何使用XML -导管光标接口从大型XML文件中提取信息(约30G)
EN

Stack Overflow用户
提问于 2015-04-05 05:00:35
回答 1查看 276关注 0票数 3

下面的问题是基于这个question的公认答案。被接受的答案的作者说,xml-conduit中的流辅助API已经有几年没有更新了(来源:accepted answer of SO question),他推荐了Cursor接口。

基于第一个问题的解决方案,我编写了下面的haskell代码,它使用了Cursor包的xml-conduit接口。

代码语言:javascript
复制
import Text.XML as XML (readFile, def)
import Text.XML.Cursor (Cursor, ($/), (&/), ($//), (>=>), 
    fromDocument, element, content)
import Data.Monoid (mconcat)
import Filesystem.Path (FilePath)
import Filesystem.Path.CurrentOS (fromText)

data Page = Page
    { title :: Text
    } deriving (Show)

parse :: FilePath -> IO ()
parse path = do
    doc <- XML.readFile def path
    let cursor = fromDocument doc
    let pages = cursor $// element "page" >=> parseTitle
    writeFile "output.txt" ""
    mapM_ ((appendFile "output.txt") . (\x -> x ++ "\n") . show) pages

parseTitle :: Cursor -> [Page]
parseTitle c = do
    let titleText = c $/ element "title" &/ content
    [Page (mconcat titleText)]

main :: IO ()
main = parse (fromText "input.xml")

此代码适用于小型XML文件。但是,当代码在30G XML文件上运行时,操作系统将终止执行。

如何使这些代码在一个非常大的XML文件上工作?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-05 12:21:42

Cursor模块要求整个内容都在内存中,在这种情况下这似乎是不可能的。如果要处理那么大的文件,则需要使用流接口。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29454267

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档