Tôi muốn lấy năm byte đầu tiên từ tập tin nắm tay trong kho lưu trữ zip. Tôi sử dụng gói zip-archive để giải nén:Làm thế nào để có lười biếng bytestring từ kho lưu trữ zip mà không có đống tràn
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
Mã này hoạt động cho lưu trữ nhỏ nhưng tôi bị tràn bộ nhớ lớn. Ví dụ:
./zip-arch test.zip +RTS -p -hy -M100M
cho archive này cho phép này heap profile
Hồ sơ heap này hiển thị mức sử dụng đống 130k, đó không phải là dấu hiệu của sự cố. Tôi sẽ tự xem. –
@DanielFischer lạ, nhưng tôi đã nhận được thông báo lỗi này: Heap cạn kiệt; Kích thước heap tối đa hiện tại là 104857600 byte (100 MB); sử dụng '+ RTS -M' để tăng nó. –
tymmym
@tymmym: 'fromEntry' sử dụng CRC32 checksum từ gói" digest ". nó crc32 bằng cách gọi crc32 trong zlib.h, điều này có thể tiêu thụ một số bộ nhớ? Tôi không chắc. – Nybble