Мне нужно сделать разбор больших (5-10 Гб) лог-файлов в Javascript/Node.js (я использую Cube).
Логлайн выглядит примерно так:
10:00:43.343423 I'm a friendly log message. There are 5 cats, and 7 dogs. We are in state "SUCCESS".
Нам нужно прочитать каждую строку, выполнить некоторый синтаксический анализ (например, удалить 5
, 7
и SUCCESS
), а затем загрузить эти данные в Cube (https://github.com/square/cube), используя свой JS-клиент.
Во-первых, каков канонический способ чтения файла в Node построчно?
Кажется, это довольно распространенный вопрос в Интернете:
- http://www.quora.com/What-is-the-best-way-to-read-a-file-line-by-line-in-node-js
- Чтение файла по одной строке за раз в узле .js?
Многие ответы, похоже, указывают на кучу сторонних модулей:
- https://github.com/nickewing/line-reader
- https://github.com/jahewson/node-byline
- https://github.com/pkrumins/node-lazy
- https://github.com/Gagle/Node-BufferedReader
Тем не менее, это кажется довольно простой задачей - ведь в stdlib есть простой способ читать текстовый файл построчно?
Во-вторых, мне нужно обработать каждую строку (например, преобразовать метку времени в объект Date и извлечь полезные поля).
Как лучше всего это сделать, максимизируя пропускную способность? Есть ли какой-нибудь способ, который не будет блокироваться ни при чтении в каждой строке, ни при отправке в Cube?
В-третьих, я предполагаю, что использование разделения строк, а JS-эквивалент contains (IndexOf != -1?) будет намного быстрее, чем регулярные выражения? У кого-нибудь был большой опыт разбора огромных объемов текстовых данных в Node.js?
Здоровья, Виктор