- Về lý thuyết thì em có thể tạo ra mảng byte với kích thước bao nhiêu tuỳ ý, nhưng trong thực tế sẽ chẳng bao giờ em tạo ra 1 mảng byte lên tới hàng MB cả. Việc cấp phát dữ liệu sẽ do hệ điều hành đảm nhiệm, JVM được viết bằng C/C++ nên nó cũng phải theo hệ điều hành. Mà việc cấp phát 1 mảng byte lớn là cực kỳ nặng nề bởi vì nó phải đi tìm kiếm các vùng nhớ còn trống sao cho đủ với kích thước em yêu cầu.
RAM dung lượng lớn hay bé đều như nhau cả em ạ, các mảng byte khởi tạo cần phải nhỏ thôi, nên dưới 100KB. Chính vì thế người ta mới sinh ra InputStream, OutputStream để đọc ghi từ từ đó em.
- File nặng có kích thước từ 30MB trở nên thì việc upload/download file là tương đối khó khăn, muốn đảm bảo rằng file sẽ upload/download thành công thì nên chia nhỏ file lớn ra rồi download các file nhỏ và ghép lại sau, đây chính là tư tưởng của giao thức hls. Và anh tin là spring chưa hỗ trợ việc này, bởi vì việc cắt nhỏ file cần phải có công cụ, có thể ffmpeg hoặc em tự code, nhưng spring thì chưa có đâu.
Nếu không muốn chia nhỏ file hoặc không thể chia nhỏ file thì em có thể sử dụng mô hình upload async và download async, tuy nhiên em sẽ cần set timeout của request dài ra, có thể 2 tiếng. Tuy nhiên nếu client bị mất mạng giữa chừng thì họ sẽ phải tải lại toàn bộ từ đầu.
- Đa luồng không làm tăng tốc độ xử lý tác vụ nặng, mà đa luồng sẽ giúp em xử lý các tác vụ nặng đồng thời, hãy phân biệt rõ. Trong thực tế thì hầu như tất cả các chương trình đều là đa luồng, ví dụ luồng main để hiển thị UI, luồng I/O để xử lý I/O Async. Và tất nhiên phải giới hạn số luồng rồi, bởi vì mỗi 1 luồng sẽ chiếm 1 số lượng tài nguyên nhất định, ví dụ java là 2MB vậy thì càng nhiều luồng thì càng tốn bộ nhớ và thời gian switch context tăng lên, vậy nên 1 chương trình chỉ nên có 300 threads là đủ rồi.
Cảm ơn anh rất nhiều !
Chúc anh luôn vui vẻ và có thật nhiều sức khỏe !
–
Hihi
1653967126000