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

标签 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)

我读到的文件大约是 50Kbytes。为什么需要 60Kbytes 内存(最大驻留)?我也尝试过使用字符串和惰性文本。这是同一张照片。我认为 Haskell 以某种方式将整个文件读入内存,或者只是分配与文件长度一样多的内存。 我怎么能防止这种情况?我只想从中读取 N 个字节,不想浪费这么多内存。

最佳答案

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

您可以尝试使用更大的文件,例如100M。您会看到最大居住数不会增加。

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

关于haskell - 为什么读取文件会占用整个文件的内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21403031/

相关文章:

haskell - 我可以仅针对 lambda 禁用 "non-exhaustive pattern matches"警告吗?

c - pthread_cond_timedwait 不会在 GHC FFI 中返回

sql - 用 Haskell 表示电路

Haskell 的 JSON 输出

c# - Visual Studio 分析 : Start/Stop from code

c++ - MSVS 2015配置文件指导的优化-在各种计算机上部署仪器构建

haskell - Haskell 中 (^) 的奇怪行为

haskell "Non-Exhaustive pattern exception"

haskell - 尝试构建一个处理不同货币金额的应用实例,我是否走错了路?

python - cProfile 在调用 numba jit 函数时会增加大量开销