[PHP] PHP에서 Generator를 이용한 대용량 데이터 처리 최적화


본문
PHP에서 수만 건 이상의 데이터를 처리할 때, foreach
나 배열을 그대로 사용하면 메모리를 과도하게 사용하게 됩니다.
이럴 때 Generator
를 사용하면, 데이터를 한 줄씩 지연 평가(lazy evaluation) 하여 메모리 사용을 획기적으로 줄일 수 있습니다.
기본 개념: Generator란?
Generator
는 반복 가능한 객체이지만, 모든 데이터를 한꺼번에 메모리에 올리지 않고, 필요할 때마다 한 개씩 반환합니다.
function simpleGenerator() {
yield 1;
yield 2;
yield 3;
}
foreach (simpleGenerator() as $value) {
echo $value; // 1 2 3
}
실전 예시: 데이터베이스 조회
기존 방식 (메모리 낭비 큼):
$users = $pdo->query("SELECT * FROM users")->fetchAll();
foreach ($users as $user) {
// 처리
}
Generator 방식 (메모리 효율적):
function getUsers(PDO $pdo): Generator {
$stmt = $pdo->query("SELECT * FROM users");
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
yield $row;
}
}
foreach (getUsers($pdo) as $user) {
// 처리
}
fetchAll()
대신 fetch()
로 한 줄씩 처리
yield
는 현재 값을 반환하고, 다음 루프로 이동할 때 다음 행을 실행함
성능 차이
# fetchAll()
방식은 100,000건에서 수십 MB의 메모리를 사용
# Generator
는 메모리 사용량이 거의 고정 (보통 수백 KB 수준)
# PHP CLI에서 memory_get_usage()
로 차이 확인 가능
댓글목록0