分块提取查询结果

在本节开始的部分,我们提到使用关系型数据库的优势之一,是可以存储大量数据。
通常,我们只提取出数据库的一个子集进行研究。然而,有时,我们需要检查的数据量还
是超过了计算机内存容量。显然不能把所有数据载入内存,所以必须逐块处理。
绝大部分关系型数据库支持逐块提取查询。接下来的例子,我们用 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( ) 一次性取出所有查询结果,内存可能会吃不消。但是,如果允许分块处理数据
来完成任务,那么上述方法不失为一个好的选择。

posted @ 2019-02-11 11:19  NAVYSUMMER  阅读(113)  评论(0编辑  收藏  举报
交流群 编程书籍