问候,
我试图理解为什么我看到整个文件使用以下程序加载到内存中,但是如果您注释掉“(***)”下面的行,那么程序会在恒定(大约 1.5M)空间中运行。
编辑:该文件大约 660MB,第 26 列中的字段是一个日期字符串,如“2009-10-01”,并且有 100 万行。该过程在到达“getLine”时使用了大约 810MB
我是否认为它与使用“split”拆分字符串有关,并且以某种方式从文件中读取的底层 ByteString 不能被垃圾收集,因为它仍然被引用?但如果是这样,那么我认为 BS.copy 会解决这个问题。任何如何强制计算的想法 - 我似乎无法将“seq”放入正确的位置以产生效果。
(注意源文件是制表符分隔的行)
提前致谢,
凯文
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