Parsowanie ogromnych plików logów w Node.js - czytaj po linii
Muszę wykonać kilka analiz dużych plików logów (5-10 Gb) w Javascript / Node.js (używam Cube).
Logline wygląda mniej więcej tak:
10:00:43.343423 I'm a friendly log message. There are 5 cats, and 7 dogs. We are in state "SUCCESS".
Musimy przeczytać każdą linię, wykonać kilka analiz (np. Rozebrać5
, 7
iSUCCESS
), następnie przepompuj te dane do Cube (https://github.com/square/cube) za pomocą swojego klienta JS.
Po pierwsze, jaki jest kanoniczny sposób odczytywania w węźle pliku po linii?
Wydaje się być dość powszechnym pytaniem online:
http://www.quora.com/What-is-the-best-way-to-read-a-file-line-by-line-in-node-jsCzytaj plik po jednym wierszu naraz w node.js?Wiele odpowiedzi wydaje się wskazywać na kilka modułów innych firm:
https://github.com/nickewing/line-readerhttps://github.com/jahewson/node-bylinehttps://github.com/pkrumins/node-lazyhttps://github.com/Gagle/Node-BufferedReaderWydaje się jednak, że jest to dość podstawowe zadanie - na pewno istnieje prosty sposób w stdlib na odczyt w pliku tekstowym, linia po linii?
Po drugie, muszę przetworzyć każdą linię (np. Przekształcić znacznik czasu w obiekt Date i wyodrębnić użyteczne pola).
Jak najlepiej to zrobić, maksymalizując przepustowość? Czy jest jakiś sposób, który nie blokuje ani czytania w każdym wierszu, ani wysyłania go do Cube?
Po trzecie - zgaduję, że przy użyciu podziałów na łańcuchy, a odpowiednik JS z include (IndexOf! = -1?) Będzie dużo szybszy niż wyrażenia regularne? Czy ktoś miał duże doświadczenie w analizowaniu ogromnych ilości danych tekstowych w Node.js?
Pozdrawiam, Victor