Поздравления,
Я пытаюсь понять, почему я вижу весь файл, загруженный в память следующей программой, все же если Вы комментируете строку ниже" (***)" затем прогоны программы в постоянном (о 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