如何在没有堆溢出的情况下从zip存档中获取lazy bytestring

tym*_*mym 7 zip haskell memory-leaks

我想从zip存档中的第一个文件中获取前五个字节.我使用zip-archive包进行解压缩:

import qualified Data.ByteString.Lazy as L
import Data.Maybe
import System.Environment (getArgs)

import Codec.Archive.Zip

main = do
    f:_ <- getArgs
    print . L.take 5 . fromEntry . head . zEntries . toArchive =<< L.readFile f
Run Code Online (Sandbox Code Playgroud)

这段代码适用于小型档案,但我有大堆溢出的堆.例如:

./zip-arch test.zip +RTS -p -hy -M100M
Run Code Online (Sandbox Code Playgroud)

为此存档提供此堆配置文件

tym*_*mym 1

我已阅读zip-archive 作者的解释并决定进行建议的修复。我已经完成了一个新的库 - zip-conduit。它的主要特点是持续的内存使用,没有惰性IO。要从 zip 存档中的第一个文件中获取前五个字节,您可以编写:

import           System.Environment
import           Data.Conduit
import qualified Data.Conduit.Binary as CB

import           Codec.Archive.Zip

main = do
    f:_ <- getArgs
    res <- withArchive f $ do
               name:_ <- fileNames
               source <- getSource name
               runResourceT $ source $$ CB.take 5
    print res
Run Code Online (Sandbox Code Playgroud)