2015-11-15 34 views
1

我在玩Haskell并编写文件。 这是一小段代码,对于[0..255]中的每个“蓝色”,都会在[0..255]中使用“红色”和“绿色”在PPM中创建图像。它在一个文件夹内产生所有图像。Haskell/GHC内存使用

这个小程序让我的电脑崩溃购买使用超过5 GB的内存,我不知道为什么。我要求他做的事情对我来说似乎很简单,生成的图像占用的空间总量为 - 200 mB ...并且不明白内存为什么会爆炸。

下面是代码:

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

编译而不是从ghci内运行。在我的机器上,这使得virt从5GB到140MB;编译版本的资源永远不会超过15MB。一般情况下(除了极少数例外),ghci的性能特征要比编译的程序差很多。