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