2.4 Các vấn đề tiếp cận
2.4.2 Đọc dữ liệu từ file lớn
Có một vài hệ thống không sử dụng công cụ quản lý nén, cắt hay chia nhỏ file log theo từng ngày mà thực hiện lưu trữ tất cả vào một file phục vụ cho nhu cầu đặc biệt nào đấy. Hoặc cũng có khi là yêu cầu từ bên khách hàng gửi sang và cần phải phân tích tập tin log lớn. Những dữ liệu như vậy thuộc thành phần bên thứ ba, có nghĩa là chúng ta bị giới hạn về quyền cũng như khối lượng dữ liệu được gửi sang đó. Với mục đích cần đưa ra một vài kết luận hay một vài quyết định. Bởi những tập tin log này rơi vào trường hợp không nằm trong hệ thống theo dõi và lấy khối dữ liệu mới sinh ra theo thời gian giống như ở trên đã trình bày. Cho nên bắt buộc chúng ta phải xử lý đọc file có dung lượng lớn.
Với file log 1 gigabytes, 2 gigabytes được coi là những file lớn thì vấn đề đơn giản là lập trình đoạn mã nạp tất cả vào trong bộ nhớ và thực hiện như một số câu lệnh dưới đây:
File.read(file_name) File.readLines(file_name)
Với file logs từ 10 gigabytes trở lên, thì bắt đầu gặp một vài khó khăn. Một số máy cấu hình thấp có thể dẫn tới OutOfMemory để đọc những file như vậy. Tuy nhiên có thể nghĩ tới phương pháp chia thành 40, 50 file nhỏ và thực hiện đọc trong nhiều Thread song song là vấn đề được giải quyết.
$ split -l 50 filename.log
Nhưng với file log cỡ 100 gigabytes hoặc có dung lượng nhiều hơn gấp 10 tới 20 lần thì chúng ta gặp vấn đề trong chính phương pháp giải quyết là chia thành các nhỏ file. Vậy cần phải tìm và đưa ra một giải pháp khác.
Đoạn sau đây sẽ trình bày và so sánh các phương pháp đọc file log và tối ưu hóa giải pháp đọc file log dung lượng lớn áp dụng cho hệ thống eLMS.
Phương pháp 1: Lặp và đọc từng dòng log (line by line)
Lặp từ đầu đến hết file để đọc tất cả các dòng log. Phương pháp này có nhược điểm là phải đọc từ đầu tới cuối, bởi vậy việc đọc file từng dòng tốn rất nhiều thời gian cũng như tài nguyên của máy tính để xử lý. Tuy nhiên, việc đọc file log offline chỉ thực hiện một lần duy nhất, nên phương pháp này cũng rất khả thi.
Phương pháp 2: Lặp và đọc theo khối dữ liệu đệm
Đối với phương pháp này, chúng ta sử dụng một bộ đệm buffer với kích cỡ được định nghĩa sẵn. Thông thường buffer-size là 128Kb. Việc đọc file đơn giản là thực hiện lệnh “open” rồi thực hiện lấy ra từng block với 128Kb dữ liệu. Chứ không phải thực hiện đọc cả file lớn.
Phương pháp 3: Sử dụng giải pháp Mapping nội dung file trong bộ nhớ [15] Phương pháp này đến từ ý tưởng sử dụng thu gom các bộ nhớ động rảnh dỗi, giúp cho bộ nhớ đệm có thể để nạp các dữ liệu từ file vào với khối lượng lớn nhất có thể. Với phương pháp này, bất kể chúng ta đang sử dụng ngôn ngữ nào để đọc file đi nữa, đều phải nhúng một đoạn mã C. Có một nền tảng là framework Boost hỗ trợ cho việc mapping nội dung file và đọc dữ liệu file cỡ lớn.