2015-11-15 1 views
1

Я играл с Haskell и записи файлов. Вот небольшой фрагмент кода, который для каждого «синих» в [0..255] создает изображение в PPM с «красного» и «зеленого» в [0..255]. Он создает в папке все изображения.использование памяти Haskell/GHC

Эта небольшая программа делает мой компьютер аварии купить, используя более 5 Гб памяти, и я не знаю, почему. То, что я попросил у него сделать, кажется довольно простым для меня, и общее пространство, занимаемое генерируемыми изображениями, - 200 мб ... и не понимает, почему память взрывается.

Вот код:

import System.Directory 
import Data.Colour.SRGB 
import Data.List.Split 

gridColours   = [[RGB 255 0 0, RGB 0 255 0], [RGB 0 0 255, RGB 0 0 0]] 
gridColours2 b  = chunksOf 256 [RGB r g b| r <- [0..255], g <- [0..255]] 

dimensions l  = (length . head $ l, length l) 
coupleToList (a,b) = [a,b] 
genDataLines list = unwords . (map showColour) . concat $ list 
genDims list  = unwords . (map show) . coupleToList . dimensions $ list 
writePPM list path = writeFile path $ unwords $ ["P3", genDims list, "255", genDataLines list] 
showColour c  = unwords . (map show) $ [channelRed c, channelGreen c, channelBlue c] 

main = do 
    createDirectoryIfMissing True "/tmp/PPM-out/" 
    mapM_ (\x -> writePPM (gridColours2 x) ("/tmp/PPM-out/image"++(show x)++".ppm")) [0..255] 

Идеальный ответ будет объяснить мне, что я сделал неправильно и дать мне советы о том, как решить эту проблему памяти моей системы от сбоев.

спасибо.

ответ

5

Compile вместо того, чтобы изнутри GHCI. На моей машине это потребовало использования от 5 до 140 МБ; res никогда не превышал около 15 МБ для скомпилированной версии. В целом (за очень небольшим исключением) характеристики производительности ghci намного хуже, чем у скомпилированной программы.