Quiero tomar los primeros cinco bytes del primer archivo en el archivo zip. Yo uso paquete de archivo ZIP para la descompresión:Cómo tomar lazy bytestring del archivo zip sin desbordamiento del montó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
Este código funciona para archivos pequeños pero tengo desbordamiento de pila con los grandes. Por ejemplo:
./zip-arch test.zip +RTS -p -hy -M100M
para este archive da este heap profile
Ese perfil montón muestra el uso del montón de 130k, eso no es indicación de un problema. Voy a echar un vistazo a mí mismo. –
@DanielFischer extraño, pero tengo este mensaje de error: Heap exhausted; El tamaño máximo de almacenamiento dinámico actual es 104857600 bytes (100 MB); use '+ RTS -M 'para aumentarlo. –
tymmym
@tymmym: 'fromEntry' utiliza la suma de comprobación CRC32 del paquete" digest ". hace crc32 invocando crc32 en zlib.h, esto puede consumir algo de memoria? No estoy seguro. – Nybble