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

Haskell 如何在没有堆溢出的情况下从zip存档中获取lazy bytestring,haskell,zip,memory-leaks,Haskell,Zip,Memory Leaks,我想从zip存档中的第一个文件中获取前五个字节。我使用zip存档包进行解压缩: 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 . t

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

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
鉴于此,请考虑呼叫。这不是超级哈斯凯利,但它做的工作。也许所有的憎恨者都应该花更多的时间修复或替换像stackoverflow这样的坏库,而不是花更少的时间在stackoverflow上

标准免责声明:不存在错误检查。这可能会泄漏把手。懒惰的i/o是懒惰的

import System.Environment (getArgs)
import System.IO (hSetBinaryMode)
import System.Process (StdStream(...), createProcess, proc, close_fds, std_out)

import qualified Data.ByteString.Lazy as L

unzipLBS :: FilePath -> IO L.ByteString
unzipLBS file = do
  let args = proc "unzip" ["-p", file]
      args' = args { std_out = CreatePipe, close_fds = True }

  (_, Just hOut, _, _) <- createProcess args'
  hSetBinaryMode hOut True
  L.hGetContents hOut

main :: IO ()
main = do
  f:_ <- getArgs
  print . L.take 5 =<< unzipLBS f
我已经阅读了zip档案作者的介绍,并决定进行推荐的修复。我已经完成了一个新的图书馆-。它的主要特点是无延迟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
导入系统环境
导入数据。管道
将限定的Data.conductor.Binary作为CB导入
导入Codec.Archive.Zip
main=do

f:u堆配置文件显示了130k的堆使用率,这并不表示存在问题。“我自己来看看。”丹尼尔觉得很奇怪,但我得到了一条错误信息:堆已耗尽;当前最大堆大小为104857600字节(100 MB);使用“+RTS-M”增加它。@tymmymem:
fromEntry
使用包“摘要”中的CRC32校验和。它通过调用zlib.h中的crc32来执行crc32,这可能会消耗一些内存?我不确定。这里解释了困难,也许你可以把它交给github进行推荐的修复。
$ runghc -Wall unzip.hs  ~/Downloads/test.zip
Chunk ",+\227F\149" Empty
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