Open xuxinhang opened 5 years ago
Haskell Real World 介绍了增加严格执行 的内容
这是 [Word8] 版本的逻辑
blockLoop :: [[Word8]] -> [Word8] -> [[Word8]] blockLoop initial blocks | null blocks = initial | otherwise = blockLoop (blockStep m initial) ms where (m, ms) = splitAt 64 blocks blockStep = blockStepWithRound 79 -- 将一个 Block 处理 79 轮
照葫芦画瓢,得到 ByteString.Lazy 版本的:
blockLoopWithBS :: [ByteSequence] -> L.ByteString -> [ByteSequence] blockLoopWithBS initial blocks | L.null blocks = initial | otherwise = blockLoopWithBS (blockStep (L.unpack m) initial) ms where (m, ms) = L.splitAt 64 blocks blockStep = blockStepWithRound 79 -- 将一个 Block 处理 79 轮
但是上面的版本在处理大文件的时候吃掉了很多很多的内存,两个G吧……
可能是 blockStep (L.unpack m) initial 惰性求值的问题,haskell 只记下来 thunk ,因为 ByteString 很长,所以 thunk 很大。但实际上,这一表达式计算出来的结果只有 5×32 个 bit 而已。
blockStep (L.unpack m) initial
关于“增加严格执行”
Haskell Real World 介绍了增加严格执行 的内容
这是 [Word8] 版本的逻辑
照葫芦画瓢,得到 ByteString.Lazy 版本的:
但是上面的版本在处理大文件的时候吃掉了很多很多的内存,两个G吧……
为什么
可能是
blockStep (L.unpack m) initial
惰性求值的问题,haskell 只记下来 thunk ,因为 ByteString 很长,所以 thunk 很大。但实际上,这一表达式计算出来的结果只有 5×32 个 bit 而已。