为什么读取文件占用整个文件的内存?

时间:2014-01-28 10:29:00

标签: haskell profiling ghc

我这样做:

import qualified Data.ByteString.Lazy.Char8 as BS

main :: IO ()
main = do
    let filename = "sample.txt"    
    text <- BS.readFile filename
    let res = BS.take 1000 $ text
    print res

当我通过分析运行它时,它给了我:

162,048 bytes allocated in the heap
2,472 bytes copied during GC
59,688 bytes maximum residency (1 sample(s))
22,232 bytes maximum slop
156 MB total memory in use (0 MB lost due to fragmentation)

我读的文件大约是50K字节。为什么需要60K字节的内存(最大驻留时间)?我也尝试过String和Lazy文本。这是相同的图片。我认为Haskell在某种程度上是将整个文件读入内存或只是分配与文件长一样多的内存。 我怎么能阻止这个?我想从它只读取N个字节,不想浪费那么多内存。

1 个答案:

答案 0 :(得分:10)

您的文件大小为50K,但readFile32k chunks读取文件。所以你有一半的文件在内存中。除此之外,一些内存用于运行时系统,gc,print中的中间惰性字符串等。所以60K最大驻留时间是可以的。

您可以尝试使用更大的文件,例如100M。你会发现最大居住率不会增长。

如果您的默认块大小不合适,请尝试hGetSome