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

 怎么找个名字这么费劲 发布于 2023-01-30 19:50

我这样做:

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 个回答
  • 您的文件大小为50K,但是readFile以32k块的形式读取文件.所以你有一半的文件在内存中.除此之外,一些内存用于运行时系统,gc,中间懒字符串print等.所以60K最大驻留时间是可以的.

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

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

    2023-01-30 19:52 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有