我有这个简单的 R 程序,它从 sqlite 数据库中读取一个表(1000000 行,10 列)到一个 R data.table 中,然后我对数据进行一些操作并尝试将其写回同一个 sqlite 的新表中数据库。读取数据需要几秒钟,但将表写回 sqlite 数据库需要几个小时。我不知道到底有多长时间,因为它从未完成,我尝试过的最长的是8小时。
这是程序的简化版本:
library(DBI)
library(RSQLite)
library(data.table)
driver = dbDriver("SQLite")
con = dbConnect(driver, dbname = "C:/Database/DB.db")
DB <- data.table(dbGetQuery(con, "SELECT * from Table1"))
dbSendQuery(con, "DROP TABLE IF EXISTS Table2")
dbWriteTable(con, "Table2", DB)
dbDisconnect(con)
dbUnloadDriver(driver)
我使用 R 版本 2.15.2,包版本是:
data.table_1.8.6 RSQLite_0.11.2 DBI_0.2-5
我已经在多个系统和不同的 Windows 版本上进行了尝试,在所有情况下,将这个表写入 sqlite 数据库都需要花费大量时间。查看 sqlite 数据库的文件大小时,它以大约每分钟 50KB 的速度写入。
我的问题是有人知道是什么导致了这种缓慢的写入速度吗?
蒂姆有答案,但我不能这样标记它,因为它在评论中。
如: 在使用 dbWriteTable 将 R 数据表保存在 SQLite 数据库中时避免达到内存限制的想法 我将数据分块写入数据库
chunks <- 100
starts.stops <- floor( seq( 1 , nrow( DB ) , length.out = chunks ) )
system.time({
for ( i in 2:( length( starts.stops ) ) ){
if ( i == 2 ){
rows.to.add <- ( starts.stops[ i - 1 ] ):( starts.stops[ i ] )
} else {
rows.to.add <- ( starts.stops[ i - 1 ] + 1 ):( starts.stops[ i ] )
}
dbWriteTable( con , 'Table2' , DB[ rows.to.add , ] , append = TRUE )
}
})
它需要:
user system elapsed
4.49 9.90 214.26
是时候完成将数据写入数据库了。显然,我在不知不觉中达到了内存限制。