Hướng dẫn transform stream nodejs
Streams trong NodeJS là gì ?Streamstrong NodeJS là một collections của dữ liệu giống như strings hay arrays, sự khác nhau duy nhất đó là các streams không tồn tại cùng một lúc. Điều khiến streams thực sự mạnh đó là khả năng làm việc khi xử lý với dữ liệu lớn (big data) hay nguồn dữ liệu đến từ nguồn bên ngoài. Show
Streams không chỉ dừng lại ở việc xử lý dữ liệu, nó còn đem lại khả năng kết hợp code một cách tuyệt vời, giống như khi kết hợp các câu lệnh lunix với nhau thành một câu lệnh duy nhất. Có rất nhiều các module của Nodejs thực hiện dựa trên hơi hướng của streams như: Streams cho phép bạn đọc dữ liệu từ một nguồn hoặc viết dữ liệu tới một đích đến. Trong NodeJS, có 4 loại streams khác nhau:
Mỗi streams đều được cấp một EventEmitter cho phép chúng ta bắt sự kiện theo từng thời điểm cụ thể. Sau đây là một vài sự kiên hay dùng :
Obejct Mode trong Stream NodeJSTất cả các streams được tạo bởi Nodejs API được hoạt động trên các đối tượng kiểu chuỗi và Buffer (hoặc Uint8Array). Tuy nhiên stream đôi lúc làm việc với các kiểu giá trị khác nhau của Javascript (ngoại trừ giá trị null). Bởi vậy chế độ object mode được thêm vào, để sử dụng bạn cần phải chuyển sang chế độ object khi bắt đầu khởi tạo streams. Việc chuyển các streams đã được khởi tạo sang object mode là điểu không an toàn với dữ liệu. Thao tác với Stream trong NodeJSStreams là một chức năng rất mạnh trong Nodejs, tưởng tượng khi bạn làm việc với dữ liệu lớn trực tiếp bạn cần phải có một vùng nhớ đủ lớn để lưu trữ nó. Giả sử chúng ta có một file text 10GB mà trong khi đó server của bạn chỉ có 1GB Ram, để đọc file này ngay thì server sẽ không thể thực hiên được vì thiếu bộ nhớ. Streams cho phép chúng ta đọc các dữ liệu lớn bằng cách chia nhỏ dữ liệu ra và đọc giá trị theo từng phần. Đọc dữ liệu với StreamsChúng ta có file dữ liệu dạng text ở file hocweb.vn Tạo file
Mở terminal và chạy dòng lệnh để xem kết quả:
Ghi dữ liệu với StreamsVới NodeJS, để ghi một file từ streams chúng ta sử dụng phương thức createWriteStream() trong module fs. Tạo file
Mở terminal và chay dòng lệnh :
Lúc này chúng ta sẽ nhận được 1 file mới có có tên output.txt có nội dung
Kĩ thuật Piping Stream trong Node.jsTrong 2 phần trước chúng ta đã tìm hiểu về cách đọc và ghi file sử dụng Streams. Trong Streams ta còn có một khái niệm khác nữa đó là Piping (đường ống) cho phép chúng ta lấy dữ liệu đầu ra từ một stream làm đầu vào trong streams khác. Nó hoạt động như một đường ống giúp chuyển dữ liệu giữa các streams với nhau. Trong ví dụ này chúng ta lấy dữ liệu của file input.txt làm dữ liệu đầu vào cho file output.txt bằng cách tạo 2 streams và nối với nhau bằng phương thức pipe :
Tiến hành chay đoạn code trên ta sẽ thất kết quả ở file output.txt
Kỹ thuật Piping Chaining trong Node.jsPiping Chaining là kĩ thuật để kết nối đầu ra của các streams lại với nhau, nối đầu ra của streams này với streams khác tạo thành một chuỗi bao gồm nhiều các streams. Nó được sử dụng với cách hoạt động của piping. Chúng ta dùng kỹ thuật này để lấy đầu ra của một file, nén nó lại sau đó tiến hành ghi file nén đó ra trong NodeJS
Khi chạy chương trình trên, chương trình sẽ lấy đầu ra của file input.txt để nén file sau đó sẽ tạo ra một file nén mới có tên output.txt.gz. Đây là một kỹ thuật được sử dụng khá nhiều. Một số ví dụ với Streams trong NodeJSNếu như phần trên chúng ta tìm hiểu về các thao tác với streams thì trong phần này mình sẽ đưa ra vài ví dụ để chứng minh sức mạnh của Streams trong việc xử lý dữ liệu. Ghi file dữ liệu lớn sử dụng StreamsĐối với việc ghi một file lớn một cách thông thường bạn cần phải sử dụng rất nhiều bộ nhớ để xử lý việc ghi file. Nhưng đối với streams việc ghi file dữ liệu lớn không tốn quá nhiều bộ nhớ.
Khi bạn ghi file bằng streams nó sẽ ghi vào file theo từng mảnh (chunk). Đọc file dữ liệu lớn sử dụng StreamsChúng ta có một file vài GB, nếu bạn đọc thông thường thì server sẽ quá tải. Cách thức hoạt động của streams trong đọc file lớn là sẽ chia đọc theo từng phần. Khái niệm Giả sử dung lượng của file
Kết quả: còn đây là đọc file sử dụng streams :
Kết luậnQua bài viết, bạn đã hiểu về Stream và cách sử dụng hiệu quả. Hãy áp dụng vào project, app của bản thân để tận dụng tối đa. Tìm hiểu thêm về NodeJS : Tối ưu tốc độ ứng dụng NodeJS khi lập trình Bài viết này mình sưu tầm và tổng hợp từ nhiều nguồn trên Internet. Nếu có gì không hiểu thì inbox messenger bên dưới mình hỗ trợ thêm nhé. |