Lời chào,Haskell ByteStrings - kết thúc bằng tệp lớn được tải vào bộ nhớ
Tôi đang cố gắng hiểu được toàn bộ tệp được tải vào bộ nhớ bằng chương trình sau, nhưng nếu bạn nhận xét dòng bên dưới "(***)" thì chương trình chạy trong không gian cố định (khoảng 1.5M).
EDIT: Tệp có kích thước khoảng 660MB, trường trong cột 26 là chuỗi ngày như '2009-10-01' và có một triệu dòng. Quá trình này sử dụng khoảng 810MB khi nó chạm vào 'getLine'
Tôi có nghĩ rằng nó liên quan đến việc tách chuỗi bằng cách sử dụng 'tách', và bằng cách nào đó ByteString nằm bên dưới đã được đọc từ tệp có thể không được thu gom rác vì nó vẫn được tham chiếu? Nhưng nếu vậy, sau đó tôi nghĩ BS.copy sẽ làm việc xung quanh đó. Bất kỳ ý tưởng làm thế nào để buộc các tính toán - Tôi dường như không thể nhận được 'seq' vào đúng nơi để có hiệu lực.
(NB file nguồn là dòng chia tách bằng tab)
Cảm ơn trước,
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
Sẽ hữu ích khi có tệp hoặc ít nhất một số thống kê về tệp đó. Tôi không tin rằng vấn đề của bạn không phải là kết quả của việc giữ tất cả '[Record]' trong bộ nhớ cùng một lúc (bắt buộc bởi lệnh gọi 'putStrLn ... last jrs'). Toàn bộ danh sách phải nằm trong bộ nhớ vì bạn truyền nó trong 'loopInput' - nếu bạn chỉ truyền' jrs cuối cùng ', hoặc nếu bạn chỉ tiêu thụ phần đầu của danh sách trước khi buộc phần còn lại, thì bạn có thể thực hiện xử lý gia tăng không gian liên tục. EDIT: Ngoài ra, làm một số hồ sơ heap. –
Tệp có kích thước khoảng 660MB, trường trong cột 26 là chuỗi ngày như '2009-10-01' và có một triệu dòng. Quá trình này sử dụng khoảng 810MB khi nó chạm vào 'getLine'. Chúc mừng! – Kevin