Stream trong NodeJS: Kinh nghiệm của 2 Lập Trình Viên xử lý tối ưu FILE LỚN như thế nào?

Поделиться
HTML-код
  • Опубликовано: 7 июл 2024
  • Stream trong NodeJS gặp một File Lớn và phong cách 2 Lập Trình Viên xử lý tối ưu thế nào?
    👉 Link khóa học backend Nodejs: / @anonystick
    Timeline:
    00:00 Câu hỏi về xử lý File lớn trong Node.js?
    00:54 Ví dụ minh họa về Stream trong Node.js?
    03:02 Ứng dụng không sử dụng Stream thì thế nào?
    05:55 Tối ưu khi xử lý File lớn bằng Stream Node.js
    🚩 Subscribe ➜ / tipsjavascript
    #stream #nodejs #backend
    ✅ Follow Me:
    Blog: anonystick.com
    Github: github.com/anonystick/anonystick
    Facebook: / tipjs
    RUclips: / tipsjavascript

Комментарии • 30

  • @cuongnguyentrung121
    @cuongnguyentrung121 6 месяцев назад +21

    1. Mình nghĩ điều quan trọng mọi người nên chú ý đó là tư tưởng và bản chất của vấn đề, thay vì tập chung vào công nghệ
    Bản chất: Bạn muốn read file X -> write file Y
    Theo logic thông thường: Bạn cần read toàn bộ file X -> write dữ liệu vào file Y
    Câu chuyện là bạn read xong thì cần lưu vào đâu đó cụ thể ở đây là RAM sau đó là write dữ liệu đó vào file Y
    Nhưng mà câu chuyện khi bạn gặp 1 file có size lớn đến độ RAM của bạn không đủ để chứa, hoặc nó quá lớn => bạn gặp vấn đề về performance ( overload bộ nhớ, ảnh hưởng đến những task vụ khác xử lý )
    Vậy thì bạn phải làm sao ? 1 trong những tư tưởng quan trọng đó là chia nhỏ vấn đề lớn thành nhiều vấn đề nhỏ rồi giải quyết từng phần
    pipe được giới thiệu kia bản chất trong code implemetation cũng là việc nta đọc 1 phần từ source ghi vào destination và lặp lại, đó là lí do tại sao dùng pipe nó chỉ tốn vài chục MB lưu vào RAM
    => Thay vì đọc toàn bộ file thì bạn
    0. Sử dụng 1 biến lưu lại vị trí cuối cùng bạn đã đọc
    1. Đọc từ vị trí cuối đã ghi 1 phần của file X lưu lại vào Ram ( ở biến data ) và lưu lại vị trí cuối cùng đã đọc
    2. Write vào file Y
    3. Nếu đã đọc hết file X thì kết thúc, không thì quay lại bước 1
    Với 1 phần ở đây là 1 lượng nhỏ vừa đủ so với tài nguyên của bạn có
    Vậy thì tư tưởng chia nhỏ này áp dụng như thế nào trong thực tế ?
    1. Bạn phải gửi mail cho 1 triệu user bạn phải làm gì ? Lấy X user gửi mail, lưu lại user cuối bạn đã xử lý, và lặp lại, với X có thể là 1K, 10K tùy hệ thống của bạn
    2. Bạn cần sync 1 triệu bản ghi từ db này sang db khác ? Lấy X bản ghi từ db A lưu vào db B, và lặp lại
    3. Bạn muốn view 1 triệu bản ghi bạn dùng câu select all ? Và bùm DB bạn treo vì RAM của DB k đủ để lấy ra. Bạn phải làm gì ? Yeah phân trang ra, mỗi trang 10, 20, 50 bản ghi mỗi trang
    Và bạn biết điều gì không, những bài toán mình liệt kê thì sẽ không có code sẵn thứ bạn cần là ý tưởng để tự implment được code, vì vậy theo mình công nghệ k quan trọng
    2. Thứ tiếp theo các bạn cần biết là điểm mạnh và điểm yếu và khi nào nên dùng:
    Như mình đã nói cách trên chỉ hiệu quả khi mà dữ liệu nhiều thực sự thôi, còn không thì bạn cứ làm cách thông thường cũng chả vấn đề gì.
    1. Ví dụ hệ thống của bạn chỉ có 100 user là tối đa bạn có cần chia nhỏ ra để xử lý không ? Câu trả lời là không
    Đừng quá cứng nhắc trong cách dùng, bạn phải nhớ chia nhỏ ra thì nó sẽ phức tạp các khâu xử lý và bạn phải xử lý lỗi khi gặp phải với từng khâu, nhiều thứ bạn chưa nhìn ra được hết
    3. Câu chuyện về chia nhỏ vấn đề to thành từng phần, nhưng 1 phần ở đây như thế nào là phù hợp
    Nó cần phù hợp với từng bài toán, phù hợp với tài nguyên của bạn.
    Ví dụ vẫn là move 1 triệu bản ghi từ DB này sang DB khác. Nhưng bạn phải cân nhắc là size của bản ghi đó là nặng hay nhẹ chẳng hạn, rồi tài nguyên của bạn có bao nhiêu lưu nổi đống data lấy ra tạm hay không ? Và nhiều yếu tố khác
    Còn trong video bảo hiệu suất nhanh gấp 100 lần thì mình chưa chắc vì bạn còn phải đo latency thực sự mới biết được ! Thông số mà đưa ra so sánh chỉ là memory ( RAM ) đã sử dụng thôi

    • @sweetjohn5968
      @sweetjohn5968 6 месяцев назад

      Chính xác, người ta tạo ra mô hình để giải quyết vấn đề chứ không ai lại đi dùng công nghệ để giải quyết vấn đề cả.

    • @codelove
      @codelove 6 месяцев назад +1

      Vâng, đây là comment chỉ những người đã xử lí dữ liệu lớn mới hiểu thật sự, bạn làm video làm những người mới đánh mất bản chất và đi học theo đúng kiểu syntas

  • @hoanginhphuc7354
    @hoanginhphuc7354 Месяц назад +1

    các bác cho em hỏi có cách nào làm như thế này trong java không nhỉ

  • @khadev2712
    @khadev2712 3 месяца назад +1

    em cảm ơn thầy đã chia sẻ

  • @aeolismonsa
    @aeolismonsa 6 месяцев назад +1

    Hay quá anh ạ

  • @sevenup139
    @sevenup139 6 месяцев назад +1

    Nghe đến đoạn "Đường ống pi pe" hài quá sếp

  • @nam.salesforce8559
    @nam.salesforce8559 3 месяца назад +1

    A có thể làm thêm về làm sao để cho download csv dung lượng lớn vài GB từ một bảng trong database không?

    • @anonystick
      @anonystick  3 месяца назад

      DUMP or export

    • @nam.salesforce8559
      @nam.salesforce8559 3 месяца назад +1

      Muốn tạo service đó a. Query data rồi xử lý thông tin rồi mới trả về chứ không export nguyên data từ bảng đó ra a.

    • @anonystick
      @anonystick  3 месяца назад

      Xem lại video về stream nha em@@nam.salesforce8559

  • @user-vl2hv6mb4b
    @user-vl2hv6mb4b 6 месяцев назад +2

    Pai pờ đọc là pi pe :) 700k đổi được 1 triệu Node 8000 -> 888 , 700/25 = 100 lần

  • @cuongnguyenhuu2836
    @cuongnguyenhuu2836 6 месяцев назад +2

    đây là trường hợp viết thẳng thôi 😅, xử lý file đó là 1 vấn đề khác

    • @hungngouc3216
      @hungngouc3216 21 день назад

      đúng rồi :D vấn đề là thường thì ta phải xử lí dữ liệu trong cái file đó rồi mới lưu lại chứ đọc xong ghi lại luôn thì chắc cả đời cũng ko gặp case này mà áp dụng

  • @dduong533
    @dduong533 Месяц назад +1

    Ace cho hỏi có ai đã từng xử lí File Lớn nhưng với action xoá chưa ạ? Ví dụ tác vụ của mình sẽ phải xoá khá nhiều file, các file có thể lớn, điều này sẽ gây stress cho hệ thống 🥲

    • @dduong533
      @dduong533 Месяц назад +1

      Phân trang và maintain mode là những cách mình có thể nghĩ ra. Nhưng vẫn có các trường hợp gặp file quá lớn, xoá vẫn gây stress hệ thống.

    • @anonystick
      @anonystick  Месяц назад

      Em phải lựa thời gian chứ?

  • @sweetjohn5968
    @sweetjohn5968 6 месяцев назад +2

    Giả sử có tấm ảnh nặng 1GB lưu ở định dạng PNG. Em chấp anh dùng FileStream (và đương nhiên không đọc toàn bộ nội dung tấm ảnh) để có thể chuyển tấm ảnh đó về đen trắng. Đây là một trong những trường hợp mà chẳng có cái FileStream gì có thể giúp.

    • @hiepoan6453
      @hiepoan6453 6 месяцев назад

      Bạn có thể chia sẻ cách xử lý được không nhỉ

    • @meditativemind91
      @meditativemind91 6 месяцев назад

      tìm cách băm nhỏ ra khi đọc thì ghép lại@@hiepoan6453

  • @trietcao1368
    @trietcao1368 6 месяцев назад +3

    A Tip cho e hỏi tí. Trước đây em có làm 1 web hiển thị realtime các video từ camera. Lúc trước thì có 5-6 camera e dùng websocket thì oke mượt mà. Giờ hiện tại số camera lên tới gần 20 nên trên web xem bị giật giật. Có cách nào để tối ưu không anh nhỉ?

  • @devlamdep
    @devlamdep 6 месяцев назад +1

    mn ơi . có kênh nào giống vậy mà cho Java ko ạ

    • @vuvanthuc8154
      @vuvanthuc8154 6 месяцев назад +1

      chắc k có kênh nào chia sẻ như này về java đâuu bác

    • @tuannv2910
      @tuannv2910 6 месяцев назад +1

      tôi đang code java đây. Tôi xem kênh để thêm skill, tư duy lập trình. chứ code tôi code bằng java luôn.

  • @tavanquang614
    @tavanquang614 6 месяцев назад +1

    Trong java thì dùng nhỉ ae

  • @lenhhoxung4741
    @lenhhoxung4741 6 месяцев назад +1

    706 mb RAM chứ nhỉ 🤨🤨🤨