On Thu, Jun 21, 2007 at 08:18:23AM -0400, Brandon S. Allbery KF8NH wrote: > > On Jun 21, 2007, at 6:40 , Andrea Rossato wrote: > > > I have this very simple program that executes an external program, > > reads its output and prints it (the program is "date"). > > The readings is done with pipes. > > > > The problem is that memory usage constantly increases over time. > > Profiling does not show garbage collection of any sort. > > Huh. Thank you; I'd observed that behavior in one of my programs but hadn't > sat down to figure out why yet, mostly because I have a workaround: if you > cap the heap (+RTS -M...) it *does* do GC. > > Which makes it sound like something I don't know how to debug. :/
well, I followed Dougal's suggestion and riduced the program into pieces. I'm also testing the difference of runProcess and runInteractiveProcess. The first seems better but I need some more test. In the first case pipes2Handles gets 80.4% alloc. In the second is runRunIntProcess to get 88%. Results are pretty much the same after all. Now I'm going to profile for memory usage: I've seen that some GC happens if you are patient enough. Thanks for your kind attention. Andrea This is the code broken up: module Main where import System.Process import System.Posix.IO import System.IO import Control.Concurrent readOutput rh = do str <- hGetLine rh return str mkPipe = do (r,w) <- createPipe return (r,w) pipes2Handles r w = do wh <- fdToHandle w rh <- fdToHandle r return (rh,wh) runRunProcess wh c = do p <- runProcess c [] Nothing Nothing Nothing (Just wh) (Just wh) return p closeHandle rh wh = do hClose wh hClose rh runWithRunProcess c = do (r,w) <- mkPipe (rh,wh) <- pipes2Handles r w p <- runRunProcess wh c exit <- waitForProcess p str <- readOutput rh closeHandle wh rh putStrLn str threadDelay $ 100000 * 1 runWithRunProcess c runRunIntProcess c = do (sin,sout,serr,p) <- runInteractiveProcess c [] Nothing Nothing return $! (sin,sout,serr,p) cHandles i o e = do hClose i hClose o hClose e runWithRunIntProcess c = do (i,o,e,p) <- runRunIntProcess c exit <- waitForProcess p str <- readOutput o cHandles i o e putStrLn str threadDelay $ 100000 * 1 runWithRunIntProcess c main' = runWithRunProcess "date" main = runWithRunIntProcess "date" _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe