首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用xml-conduit parseBytes堆积内存

使用xml-conduit parseBytes堆积内存
EN

Stack Overflow用户
提问于 2019-03-29 20:38:53
回答 1查看 36关注 0票数 1

我正在使用XML -conduit的流接口https://hackage.haskell.org/package/xml-conduit-1.8.0/docs/Text-XML-Stream-Parse.html#v:parseBytes解析一些相当大的xml文件,但是我看到了内存的积累(这里是一个小的测试文件):

排名靠前的用户是:

实际数据不应该占用那么多堆-如果我序列化并重新读取,驻留内存使用的是千字节,而不是这里的兆字节。

我用来重现这一点的最小例子是:

代码语言:javascript
复制
{-# LANGUAGE BangPatterns      #-}
{-# LANGUAGE OverloadedStrings #-}

module Main where

import           Control.Monad
import           Control.Monad.IO.Class
import           Data.Conduit
import           Data.Conduit.Binary    (sourceFile)
import qualified Data.Conduit.List      as CL
import           Data.Text              (Text)
import           Text.XML.Stream.Parse

type Y = [(Text, Text)]

main :: IO ()
main = do
  res1 <- runConduitRes $
          sourceFile "test.xml"
          .| Text.XML.Stream.Parse.parseBytes def
          .| parseMain
          .| CL.foldM get []
  print res1

get :: (MonadIO m, Show a) => [a] -> [a] -> m [a]
get acc !vals = do
 liftIO $! print vals           -- this oughta force it?
 return $! take 1 vals ++ acc

parseMain = void $ tagIgnoreAttrs "Period" parseDetails

parseDetails = many parseParam >>= yield

parseParam = tag' "param" parseParamAttrs $ \idAttr -> do
  value <- content
  return (idAttr, value)

parseParamAttrs = do
  idAttr <- requireAttr "id"
  attr "name"
  return idAttr
EN

回答 1

Stack Overflow用户

发布于 2019-03-29 20:38:53

如果我将get更改为只返回["hi"]或其他什么,我就不会得到积压。因此,返回的文本似乎保留了对它们所在的较大文本的一些引用(例如,零拷贝切片,参见。注释在https://hackage.haskell.org/package/text-0.11.2.0/docs/Data-Text.html#g:18 ),所以文本的其余部分不能被垃圾收集,即使我们只使用了很小的部分。

我们的解决方法是在任何我们想要生成的属性上使用Data.Text.copy

代码语言:javascript
复制
someattr <- requireAttr "n"
yield (T.copy someattr)

这让我们可以使用几乎不变的内存进行解析。

(如果我们想节省更多的内存,我们可以考虑使用https://markkarpov.com/post/short-bs-and-text.html#shorttext。)

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

https://stackoverflow.com/questions/55417620

复制
相关文章

相似问题

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