Haskell 懒惰IO-字符串未被垃圾收集?

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

我目前正在尝试将XML文件的内容读入
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