这是一个创建 1MInt
数字并将它们放在列表中的代码。
main = do
let l = [1..1000000]
putStrLn $ show $ sum (foldl (\aux p -> p:aux) [] l)
(我知道它可能更优化(sum
在 中fold
),但我的观点不同。)看看这个版本
import qualified Data.ByteString.Lazy.Char8 as B
import qualified Data.ByteString.Lazy.Builder as Builder
import Data.ByteString.Lazy.Builder.ASCII
import Data.Maybe
import Data.List
main = do
let l = map (Builder.toLazyByteString . intDec ) [1..1000000]
let l2 = map (fst . fromJust . B.readInt) l
putStrLn $ show $ sum (foldl' (\aux p -> p:aux) [] l2)
这个版本需要90MB内存!为什么?这是一个分析输出
紫色区域是什么?
编辑 阅读评论后,我想添加一些说明。
这是一个测验。我想在内存中保留 1M 个数字(我正在构建一个查找表)。所以我“想强制将整个列表保存在内存中”。但我不想保留字节串。我的小代码模拟了我从磁盘加载字节串,将其转换为整数并将整数保存在内存中的情况。(这是我的目标)。但不知何故,字节串仍保留在内存中。为什么?