더북(TheBook)

실제로 while 루프는 반복 횟수를 정확히 알 수 없을 때 주로 사용한다. 예를 들어 데이터베이스 쿼리의 결과 집합을 여러 부분으로 나누어 행으로 불러올 때 이러한 상황이 많이 발생한다. 다음 코드는 이러한 예를 잘 보여 준다.

res <- dbSendQuery(con, "SELECT * FROM table1 WHERE type = 1")
while (!dbHasCompleted(res)) {
    chunk <- dbFetch(res, 10000)
    process(chunk)
}

먼저 con을 연결하여 데이터베이스에서 type1인 모든 레코드를 수집하는 쿼리를 요청한다. 데이터베이스에서 결과 res가 반환되면 덩어리별로 나누어 한 번에 하나씩 처리한다. 레코드 개수가 얼마나 될지 쿼리를 요청하기 전까지는 알 수 없기 때문에 dbHasCompleted() 함수를 써서 모든 데이터를 완전히 가져왔을 때 끝나는 while 루프를 사용해야 한다.

우리는 이러한 방식으로 거대한 데이터 프레임을 한꺼번에 메모리로 가져오는 것을 방지한다. 그 대신 작은 덩어리 단위로 나누어 작업한다. 이것으로 적은 양의 메모리를 사용하여 대량의 데이터를 처리할 수 있다. 물론 이것은 알고리즘 부분인 process() 함수가 데이터를 부분 단위로 처리한다고 전제한다.

앞 예제나 용어가 익숙하지 않더라도 걱정하지 말자. 데이터베이스는 이후에 더 자세히 다룰 것이다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.