L.S.,


As my e-mail program mangled the copy/pasted source code a bit, I resend it as an attachment.

Best regards,
Henk-Jan van Tuyl


On Fri, 10 Oct 2003 01:33:48 +0200, Henk-Jan.van.Tuyl <[EMAIL PROTECTED]> wrote:



L.S.,


After reading through 60 or 61 files (about 220 kB), Hugs fails with the message:
     (1426170 reductions, 2976893 cells, 68 garbage collections)
     ERROR - Garbage collection fails to reclaim sufficient space

This is done with the program below (ReadALot.lhs), which reads a series of files 
(these files are listed in dir.dat).
The program reads the first and the last (non-empty) line of each file and writes 
them, together with the filename in
the output file result.dat.

The program works fine when compiled with GHC, it then reads 2946 files without a problem.

More info.:
System:       Windows 98
Hugs version: Nov 2002

Best regards,
Henk-Jan van Tuyl
{-
   ReadALot.lhs
   Read a lot of files

   2003-10-06

   History:
   031009  Added dummy parameter to "main"
-}

> import IO
> import Monad

> inputSet   :: String
> inputSet   = "dir.dat"

> outputFile :: String
> outputFile = "result.dat"

===============================================================================
main
===============================================================================

> main :: a -> IO ()
> main _ = 
>   do 
>     hInputSet   <- openFile inputSet   ReadMode
>     hOutputFile <- openFile outputFile WriteMode
>     fileNames   <- hGetContents hInputSet
>     allData     <- collectAllData $ lines fileNames 
>     hPutStrLn hOutputFile $ unlines allData   
>     hClose hInputSet
>     hClose hOutputFile


===============================================================================
collectAllData 
Read a list of file names and return file name, first line and last line
of each file in a list
===============================================================================

> collectAllData :: [String] ->      -- A list of filenames
>                   IO [String]      -- A list of results
> 
> collectAllData []                     = return []
> collectAllData (fileName : fileNames) = 
>   do
>     putStrLn $ "Reading: " ++ fileName
>     h <- openFile fileName ReadMode
> 
>     contents <- hGetContents h
>
>     dataFromFile <- 
>       return           $! 
>         parseFile      $ 
>         filter (/= "") $ 
>         lines contents 
>
>     let (firstLine, lastLine) = dataFromFile 

      To force reading of the file before closing, we add a "when" (from 
      the Monad library), with a boolean expression that uses lastLine
      and will always be true:

>     when (length lastLine >= 0) $
>       hClose h
>
>     rest  <- collectAllData fileNames
>
>     return $ fileName : firstLine : lastLine : "" : rest


===============================================================================
parseFile 
Returns the first and the last string of a list of strings, as a tuple
===============================================================================

> parseFile :: [String] -> (String, String)
> parseFile []       = ("", "")
> parseFile [x]      = (x,  "")
> parseFile (x : xs) = (x,  last xs)


_______________________________________________
Hugs-Bugs mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/hugs-bugs

Reply via email to