gpt4 book ai didi

haskell - 如何从 zip 存档中获取惰性字节串而不发生堆溢出

转载 作者:行者123 更新时间:2023-12-02 16:57:04 25 4
gpt4 key购买 nike

我想从 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

这段代码适用于小型文件,但我遇到了大型文件的堆溢出。例如:

./zip-arch test.zip +RTS -p -hy -M100M

为此archive给出这个 heap profile

最佳答案

考虑调用 unzip 。它不是 super haskkelly,但它可以完成工作。也许所有的仇恨者都应该花更多的时间修复或替换损坏的库,例如 zip-archive并且在 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

似乎有效:

$ runghc -Wall unzip.hs  ~/Downloads/test.zip
Chunk ",+\227F\149" Empty

关于haskell - 如何从 zip 存档中获取惰性字节串而不发生堆溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9226191/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com