2013-11-11 7 views
2

У меня есть текстовый файл (~ 300 Мб большой) с вложенным списком, похожий на этот:Haskell: Как использовать attoparsec для того, чтобы прочитать вложенный список из байтовой строки

[[4, 9, 11, 28, 30, 45, 55, 58, 61, 62, 63, 69, 74, 76, 77, 82, 87, 92, 93, 94, 95], [4, 9, 11, 28, 30, 45, 55, 58, 61, 62, 63, 69, 74, 76, 77, 82, 87, 92, 93, 94],[4, 9, 11, 28, 30, 45, 55, 58, 61, 62, 63, 69, 74, 76, 77, 82, 85, 87, 92, 93, 94, 95]] 

Вот мой программа для чтения файлов в Haskell Integer списка:

import qualified Data.ByteString as ByteStr 

main :: IO() 

-- HOW to do the same thing but using ByteStr.readFile for file access? 
main = do fContents <- readFile filePath 
      let numList = readNums fContents 
      putStrLn (show nums) 

Это работает для небольших текстовых файлов, но я хочу использовать ByteString быстро прочитать файл. Я узнал, что для ByteString нет функции read, вместо этого вы должны написать свой собственный парсер в attoparsec, так как он поддерживает синтаксический анализ ByteStrings.

Как использовать attoparsec для разбора вложенного списка?

+0

Вы хотите прочитать весь список за один раз, или обработать его на куски? –

+0

читать список за один раз. – mrsteve

ответ

5

данные, как представляется, в формате JSON, так что вы можете использовать Data.Aesondecode функцию, которая работает на ByteString

import qualified Data.ByteString.Lazy as BL 
import Data.Aeson 
import Data.Maybe 

main = do fContents <- BL.readFile filePath 
      let numList = decode fContents :: Maybe [[Int]] 
      putStrLn (show $ fromJust numList) 
+0

теперь на 50% быстрее для небольших файлов, возможно, даже больше для больших. Великий! – mrsteve

+1

Для 50 МБ файла это быстро использует 10 ГБ памяти. Как я могу использовать память? – mrsteve

+1

Ну [[Целое]] не самый эффективный формат памяти (там, вероятно, нет ничего хуже) ... [[Int]] будет немного лучше, но вектор Vector of Int, вероятно, будет правильным ответом (и он должен быть быстрее). Эсон должен знать, как декодировать это отлично. – Jedai