Haskell ByteStrings - окончание с большим файлом, загруженным в память

Поздравления,

Я пытаюсь понять, почему я вижу весь файл, загруженный в память следующей программой, все же если Вы комментируете строку ниже" (***)" затем прогоны программы в постоянном (о 1.5M) пространство.

Править: Файл составляет приблизительно 660 МБ, поле в столбце 26 является строкой даты как '2009-10-01', и существует один миллион строк. Процесс использует приблизительно 810 МБ к тому времени, когда он поражает 'getLine'

Действительно ли я прав в размышлении, что это связано с разделением строкового использования 'разделение', и что так или иначе базовый ByteString, который был считан из файла, не может быть собран "мусор", потому что на это все еще ссылаются? Но если так, затем я думал, что BS.copy будет работать вокруг этого. Любые идеи, как вызвать вычисление - я, может казаться, не заставляю 'seq' в правильное место иметь эффект.

(NB исходный файл является разделенными от вкладки строками),

Заранее спасибо,

Kevin

module Main where

import System.IO
import qualified Data.ByteString.Lazy.Char8 as BS
import Control.Monad


type Record = BS.ByteString

importRecords :: String -> IO [Record]
importRecords filename = do
    liftM (map importRecord.BS.lines) (BS.readFile filename)

importRecord :: BS.ByteString -> Record
importRecord txt = r
  where 
    r = getField 26
    getField f = BS.copy $ ((BS.split '\t' txt) !! f)

loopInput :: [Record] -> IO ()
loopInput jrs = do
    putStrLn $ "Done" ++ (show $ last jrs)
    hFlush stdout
    x <- getLine
    return ()

    -- (***)
    loopInput jrs

main = do 
    jrs <- importRecords "c:\\downloads\\lcg1m.txt"
    loopInput jrs
5
задан Kevin 18 October 2010 в 20:57
поделиться