【发布时间】:2011-04-18 20:47:57
【问题描述】:
我最近开始使用 RODBC 作为I couldn't get RPostgreSQL to compile and run in Windows x64 连接到 PostgreSQL。我发现两个包之间的读取性能相似,但写入性能则不然。例如,使用 RODBC(其中 z 是 ~610 万行数据帧):
library(RODBC)
con <- odbcConnect("PostgreSQL84")
#autoCommit=FALSE seems to speed things up
odbcSetAutoCommit(con, autoCommit = FALSE)
system.time(sqlSave(con, z, "ERASE111", fast = TRUE))
user system elapsed
275.34 369.86 1979.59
odbcEndTran(con, commit = TRUE)
odbcCloseAll()
而对于使用 RPostgreSQL(32 位以下)的相同 ~610 万行数据帧:
library(RPostgreSQL)
drv <- dbDriver("PostgreSQL")
con <- dbConnect(drv, dbname="gisdb", user="postgres", password="...")
system.time(dbWriteTable(con, "ERASE222", z))
user system elapsed
467.57 56.62 668.29
dbDisconnect(con)
因此,在这个测试中,RPostgreSQL 在写表方面的速度大约是 RODBC 的 3 倍。无论数据框中的行数如何,这个性能比似乎都保持不变(但列数的影响要小得多)。我确实注意到 RPostgreSQL 使用类似 COPY <table> FROM STDIN 的东西,而 RODBC 发出一堆 INSERT INTO <table> (columns...) VALUES (...) 查询。我还注意到 RODBC 似乎为整数选择了 int8,而 RPostgreSQL 在适当的地方选择了 int4。
我需要经常做这种数据帧复制,所以我会非常真诚地感谢任何关于加速 RODBC 的建议。例如,这只是 ODBC 固有的,还是我没有正确调用它?
【问题讨论】:
-
根据我将大量数据填充到 Postgres 的有限经验,从
INSERT INTO切换到COPY是获得可接受性能的必要条件。
标签: r performance rodbc rpostgresql