Haskell 懒惰IO-字符串未被垃圾收集?
我目前正在尝试将XML文件的内容读入Haskell 懒惰IO-字符串未被垃圾收集?,haskell,Haskell,我目前正在尝试将XML文件的内容读入mapint(mapint字符串)中,它工作得很好(使用HaXml)。但是,我对程序的内存消耗不满意,问题似乎是垃圾收集 下面是我用来读取XML文件的代码: type TextFile = Map Int (Map Int String) buildTextFile :: String -> IO TextFile buildTextFile filename = do content <- readFile filename
mapint(mapint字符串)
中,它工作得很好(使用HaXml)。但是,我对程序的内存消耗不满意,问题似乎是垃圾收集
下面是我用来读取XML文件的代码:
type TextFile = Map Int (Map Int String)
buildTextFile :: String -> IO TextFile
buildTextFile filename = do content <- readFile filename
let doc = xmlParse filename content
con = docContent (posInNewCxt filename Nothing) doc
return $ buildTF con
不幸的是,这并没有真正改变任何事情(或者我用错了吗?)。不要猜测什么在消耗内存,一定要找出原因 第一步是确定哪些类型消耗的内存最多。您可以在这里看到许多堆分析的示例,或者阅读 强制计算 如果问题是延迟计算(您正在构建一个可以计算XML文档类型的堆上thunk,并将字符串也留在堆中),那么使用rnf和seq:
buildTextFile :: String -> IO TextFile
buildTextFile filename = do content <- readFile filename
let doc = xmlParse filename content
con = docContent (posInNewCxt filename Nothing) doc
res = buildTF con
return $ rnf res `seq` res
buildTextFile::String->IO文本文件
buildTextFile filename=do content您是否尝试了deepSeq
?这是懒惰IO的常见问题。在这种情况下,严格IO可能会更好。请记住,字符串
需要12个字节/字符,因此即使将其严格化,也会占用大量空间。@hvr:另请参见--(:)
构造函数本身就是三个字,假设您只使用GHC缓存的Char
值,那么32位系统上已经有12个字节。@bzn我的意思是,为什么不对最终返回值进行深度排序?比如:let x=builtTF con;x`deepseq`buildTF con
@bzn:根据经验,如果您希望在内存中同时存储大量内容,那么任何内容的列表都是可疑的。除非您实际上是在某种生产者/消费者对之间传输字符,或者只使用非常短的字符串,String
有点可怕。
buildTextFile :: String -> IO TextFile
buildTextFile filename = do content <- readFile filename
let doc = xmlParse filename content
con = docContent (posInNewCxt filename Nothing) doc
res = buildTF con
return $ rnf res `seq` res