thủ thuật xử lý dữ liệu lớn trong PHP

Thủ thuật xử lý dữ liệu lớn trong PHP

Trong quá trình học và làm việc với ngôn ngữ lập trình PHP, ắt hẳn bạn đã từng đau đầu khi gặp vấn đề cần xử lý dữ liệu lớn trong PHP

Một vấn đề cụ thể thường thấy đó là khi bạn cần phải đọc một file dữ liệu lên đến hàng triệu dòng và insert dữ liệu này vào cơ sở dữ liệu. Vậy thì cách giải quyết vấn đề này như thế nào ?

Đưa ra giải pháp xử lý dữ liệu lớn trong PHP

Để giải quyết vấn đề xử lý dữ liệu lớn trong PHP thì chúng ta sẽ áp dụng thủ thuật chia để trị để xử lý dữ liệu lớn, tức là sẽ đọc từng phần của một file dữ liệu.

Mình lấy ví dụ bạn cần đọc một file dữ liêu là xml chứa 2 triệu dòng, việc đọc 1 lần và đưa dữ liệu vào cơ sở dữ liệu sẽ làm chậm hệ thống và rất mất thời gian, bởi lẽ khi đọc 2 triệu dòng dữ liệu, hệ thống của bạn phải dành hết công suất để đọc 2 triệu dòng này, khiến cho hệ thống phải chờ để xử lý, do vậy làm ảnh hưởng đến những công việc khác đang cần chờ xử lý tiếp theo. Hơn nữa, đọc 1 lúc 2 triệu dòng dữ liệu và đưa vào cơ sở dữ liệu sẽ có thể gây chết hệ thống của bạn.

Chính vì thế, thay vì đọc 1 lúc 2 triệu dòng dữ liệu, chúng ta có thể chia ra đọc thành từng phần theo từng khoảng thời gian khác nhau, chẳng hạn mỗi lần đọc khoảng 5 phút là nghỉ, rồi 5 phút tiếp theo lại đọc tiếp dòng dữ liệu tiếp theo trở đi, cứ thế đọc cho đến hết 2 triệu dòng dữ liệu. Giải pháp này sẽ giúp cho việc xử lý dữ liệu lớn trở nên dễ dàng và nhẹ nhàng hơn.

Thực thi giải pháp xử lý dữ liệu lớn trong PHP

Ở phần trên mình đã đưa ra giải pháp. Trong phần này chúng ta sẽ tiến hành thực thi, hiện thực hóa giải pháp một các cụ thể hơn.

a. Thuật toán

Thuật toán để giải quyết vấn đề trên đó là với 2 triệu dòng dữ liệu trong file xml chúng ta sẽ làm như sau:

  1. Set khoảng thời gian tối đã cho mỗi lần đọc là 5 phút
  2. Sau khi đọc 5 phút, lưu lại vị trí index đã dừng
  3. Tiếp tục đọc từ vị trí đã dừng
  4. Lặp lại bước 1,2
  5. Kiểm tra thời gian đọc nếu < 5 phút tức là đã đọc hết file dữ liệu xml
  6. Dừng việc đọc dữ liệu

b. Tiến hành code hiện thực hóa vấn đề

<?php
// Lấy vị trí index hiện hành
function get_continue_point(){
	$continue_point = file_get_contents('continue_point.txt');
}
// Lưu vị trí index vào file continue_point.txt
function save_continue_point($continue_point){
	file_put_contents('continue_point.txt', $continue_point);
}
$max_time = 300; // 300 giây = 5 phút
$start_time = time(); // Khởi tạo thời điểm bắt đầu chạy
$running_time = time(); // Khởi tạo thời gian chạy
$continue_point = get_continue_poin(); // Điểm chạy tiếp theo

$xml=simplexml_load_file("big_data.xml"); // File xml chứa 2 triệu dòng dữ liệu
$run = 0;
// Chạy vòng lặp đọc dữ liệu
foreach ($xml as $child_node) {
	$run++;
	// Nếu vị trí chạy nhỏ hơn $continue_point thì bỏ qua
	if ($run <= $continue_point )
		continue;

	// Xử lý dữ liệu ở đây, chẳng hạn insert dữ liệu vào cơ sở dữ liêu
	// $sql = "insert something to db";

	// Set thời điểm hiện tại của vòng lặp
	$running_time = time();

	// Nếu thời gian chạy quá thời gian cho phép thì thoát khỏi vòng lặp
	if ($running_time - $start_time >= $max_time) {
		break;
	}

}

save_continue_point($run);

?>

c. Giải thích

Ở đoạn code trên mình khởi tạo 4 tham số là :

  1. $max_time : Số thời gian tối đa cho mỗi lần thực thi
  2. $start_time : Thời điểm bắt đầu xử lý
  3. $running_time : Thời điểm xử lý
  4. $continue : Vị trí index đã dừng và tiếp tục

Khi vòng lặp foreach chạy và duyệt từng node của file xml và tiến hành đọc dữ liệu để lưu vào cơ sở dữ liệu, song song đó ta sẽ check xem thời gian vòng lặp chạy có quá thời gian tối đa cho phép là tối đa 5 phút hay không bằng đoạn code

// Nếu thời gian chạy quá thời gian cho phép thì thoát khỏi vòng lặp
	if ($running_time - $start_time >= $max_time) {
		break;
	}

Nếu đã quá thời gian cho phép thì sẽ tiến hành thoát khỏi vòng lặp bằng lệnh break, sau khi thoát khỏi vòng lặp ta sẽ tiến hành lưu vị trí index đã dừng

save_continue_point($run);

Ở lần chaỵ code lần 2, khi chạy lại toàn bộ đoạn code trên, chúng ta sẽ tiến hành kiểm tra xem các vị trí đã đọc rồi thì bỏ qua và không đọc nữa bằng câu lệnh continue và như vậy code sẽ chỉ chạy từ thời điểm dừng $continue_point trở đi mà thôi

// Nếu vị trí chạy nhỏ hơn $continue_point thì bỏ qua
	if ($run <= $continue_point )
		continue;

Tổng kết

Bài viết này mình chia sẽ một thủ thuật nho nhỏ giúp bạn xử lý dữ liệu lớn trong PHP. Đây là một thủ thuật rất có ích cho bạn trong quá trình làm việc với các hệ thống lớn và yêu cầu xử lý dữ liệu lớn

Thủ thuật này sẽ làm giảm tại áp lực lên hệ thống của bạn, giúp nó chạy mượt và đỡ tốn thời gian đợi hơn.

Chúc các bạn thành công !

Gợi ý : Bạn là người mới và muốn tìm hiểu về Bitcoin nhưng không biết bắt đầu từ đâu? Click xem ngay Hướng Dẫn Đầu Tư Bitcoin Cho Người Mới nhé!

Có ích

tạo form upload trong php

Tạo trang Thêm thành viên (Phần 13)

Tiếp tục chuỗi seri tạo website hoàn chỉnh với PHP, phần này mình sẽ hướng …

Subscribe
Notify of
guest

11 Bình Luận
Inline Feedbacks
Xem Tất Cả Bình Luận
Hiếu Hoàng
Hiếu Hoàng
3 năm trước

Chào bạn, cám ơn bạn đã quan tâm, bạn vui lòng nhắn tin với mình qua đây, để mình hỗ trợ : https://m.facebook.com/kiemtiennecom/

HanhLam
HanhLam
3 năm trước

Mình chờ̀ email của bạn. Mong bạn tậm với người mới như mình

Nam
5 năm trước

Đúng cái em tìm 🙂 cảm ơn ad!

tuấn hoàng
tuấn hoàng
5 năm trước

ý tưởng rất hay, cám ơn ad

tuấn tâm
tuấn tâm
5 năm trước

tuyet voi, hy vong ad ra nhieu bai hay hon nua

HanhLam
HanhLam
Phản hồi đến  tuấn tâm
3 năm trước

Chào bạn, mình tải Brave từ trang của bạn về nhưng vẫn kg biết cách sử dụng, vì mình kg fải là dân chuyên, chỉ mới biết xài mạng internet kg đến 20 ngày nữa. Mình thấy ý tưởng Brave rất hay. Mong bạn tận tâm dạy mình cách sử dụng wa ĐT hoặc video đc̣ kg bạn ơi. Với lại minh cũng muốn thử kiếm tiền giống hư trên trang của bạn viết. Chẳng hạn như tiền điện tử gì đó. Mong bạn giúp mình. Cảm ơn

tuấn tâm
tuấn tâm
5 năm trước

Bài viết rát hay, cám ơn anh !

11
0
Bạn có ý kiến về bài viết, hãy để lại bình luận nhé!x
()
x