在本节开始的部分,我们提到使用关系型数据库的优势之一,是可以存储大量数据。

通常,我们只提取出数据库的一个子集进行研究。然而,有时,我们需要检查的数据量还

是超过了计算机内存容量。显然不能把所有数据载入内存,所以必须逐块处理。

绝大部分关系型数据库支持逐块提取查询。接下来的例子,我们用 dbSendQuery( ) 进

行查询,而不是用 dbGetQuery( )。然后,我们重复地从查询结果中取回一块数据(几

行记录),直到取回所有的查询结果。通过这种方式,逐块地处理数据,便不需要用到很大

的内存空间。

con <- dbConnect(SQLite( ), "data/datasets.sqlite")

res <- dbSendQuery(con,

"select carat, cut, color, price from diamonds

where cut = 'Ideal' and color = 'E' ")

while(!dbHasCompleted(res)){

chunk <- dbFetch(res, 800)

cat(nrow(chunk), "records fetched\n")

}

## 800 records fetched

## 800 records fetched

## 800 records fetched

## 800 records fetched

## 703 records fetched

dbClearResult(res)

## [1] TRUE

dbDisconnect(con)

## [1] TRUE

实践中,数据库中可能有数十亿条记录,查询结果有可能达到千万条。如果用 dbGet

Query( ) 一次性取出所有查询结果,内存可能会吃不消。但是,如果允许分块处理数据

来完成任务,那么上述方法不失为一个好的选择。