Ho scritto un codice seguente analisi utilizzando attoparsec
:Conversione normale codice attoparsec parser al condotto/tubo basato
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
Questo funziona bene per i file di piccole dimensioni, ho eseguito in questo modo:
main :: IO()
main = do
text <- TL.readFile "./testFile"
let (Right a) = parseOnly (manyTill anyChar endOfLine *> tParser) text
print a
Ma quando la dimensione del file è maggiore di 70 MB, consuma tonnellate di memoria. Come soluzione, ho pensato di utilizzare attoparsec-conduit
. Dopo aver esaminato il loro API, non sono sicuro di come farli funzionare insieme. Il mio parser ha il tipo Parser Test
ma è sinkParser
effettivamente accetta il parser del tipo Parser a b
. Sono interessato a come eseguire questo parser nella memoria costante? (Una soluzione basata su pipe è accettabile, ma non sono utilizzata per l'API Pipes.)