Napisałem następujący kod parsowania przy użyciu attoparsec
:Konwersja normalny kod attoparsec parsera do przewodu/rury oparty
data Test = Test {
a :: Int,
b :: Int
} deriving (Show)
testParser :: Parser Test
testParser = do
a <- decimal
tab
b <- decimal
return $ Test a b
tParser :: Parser [Test]
tParser = many' $ testParser <* endOfLine
Działa to dobrze dla małych plików wielkości, mogę wykonać to tak:
main :: IO()
main = do
text <- TL.readFile "./testFile"
let (Right a) = parseOnly (manyTill anyChar endOfLine *> tParser) text
print a
Ale gdy rozmiar pliku jest większy niż 70 MB, zużywa mnóstwo pamięci. Jako rozwiązanie, pomyślałem, że użyłbym attoparsec-conduit
. Po przejściu przez ich API, nie jestem pewien, jak sprawić by ze sobą współpracowały. Mój analizator składni ma typ Parser Test
, ale jest to sinkParser
, który akceptuje parser typu Parser a b
. Interesuje mnie, jak wykonać ten parser w stałej pamięci? (Rozwiązanie oparte rury A jest również do przyjęcia, ale nie będę wykorzystane do rur API).