Skip to content

strange space usage

This program:

module Main (main) where

import System.IO.Unsafe

main :: IO ()
main = do writeFile "wibbleflibble" (replicate 100 'z')
          bs <- getCs $ g $ replicate 1000000 "flibble"
          print $ last bs

getCs :: [FilePath] -> IO String
getCs [] = return ""
getCs (c : cs) = do x <- readFile c
                    xs <- unsafeInterleaveIO $ getCs cs
                    return (x ++ xs)

g :: [FilePath] -> [FilePath]
g is = map f is

f :: FilePath -> FilePath 
f fn = "wibble" ++ fn

when run:

$ ghc -fforce-recomp -Wall --make -O2 -prof -auto-all z.hs -o z
$ ./z +RTS -h -p

shows that around 100k is used by f (h.png). Running with

$ ./z +RTS -hcf -hy -p

shows that it is all of type [] (hcf_hy.png). That seems like a large amount of space for a 13 character filename, so it smells to me like something is wrong somewhere.

If we inline g:

module Main (main) where

import System.IO.Unsafe

main :: IO ()
main = do writeFile "wibbleflibble" (replicate 100 'z')
          bs <- getCs $ map f $ replicate 1000000 "flibble"
          print $ last bs

getCs :: [FilePath] -> IO String
getCs [] = return ""
getCs (c : cs) = do x <- readFile c
                    xs <- unsafeInterleaveIO $ getCs cs
                    return (x ++ xs)

f :: FilePath -> FilePath 
f fn = "wibble" ++ fn

then it all disappears (h2.png).

Trac metadata
Trac field Value
Version 6.10.1
Type Bug
TypeOfFailure OtherFailure
Priority normal
Resolution Unresolved
Component Compiler
Test case
Differential revisions
BlockedBy
Related
Blocking
CC
Operating system
Architecture
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information