下午好,
在计算了一个相当大的向量(比2 ^ 20个元素短一点)之后,我必须将结果存储在数据库中。
使用简单的代码执行脚本大约需要4个小时,例如:
#Do the processing
myVector<-processData(myData)
#Sends every thing to the database
lapply(myVector,sendToDB)
您认为最有效的方法是什么?
我考虑使用相同的查询来插入多个记录(多个插入),但它只是回到“清理”数据。
是否有任何矢量化函数会将其发送到数据库中?
有趣的是,代码在开始处理向量的第一个元素之前需要花费大量时间。也就是说,如果我在browser()
内放置一个sendToDB
电话,则首次到达之前需要20分钟(我的意思是20分钟而不考虑前一行处理数据)。所以我想知道R在这段时间做了什么?
是否有另一种方法可以在R中进行此类操作,我可能已经错过了(并行处理可能?)
谢谢!
PS:这是sendToDB函数的一个字体:
sendToDB<-function(id,data) {
channel<-odbcChannel(...)
query<-paste("INSERT INTO history VALUE(",id,",\"",data,"\")",sep="")
sqlQuery(channel,query)
odbcClose(channel)
}
这就是主意。
更新
我正在尝试LOAD DATA INFILE
命令。
我仍然不知道为什么第一次达到lapply
的内部功能需要这么长时间。
解
LOAD DATA INFILE
确实要快得多。使用write
逐行写入文件是可以承受的,write.table
甚至更快。
我遇到lapply
的开销来自于我正在循环POSIXct
个对象的事实。使用seq(along.with=myVector)
然后处理循环内的数据要快得多。
答案 0 :(得分:3)
如何将其写入某个文件并调用LOAD DATA INFILE?这应该至少给出一个基准。顺便说一句:你使用什么样的DBMS?
答案 1 :(得分:3)
您可以使用sqlSave代替您的sendToDB函数。在内部,它使用一个准备好的insert语句,它应该比单个插入更快。
但是,在使用MS SQL的Windows平台上,我使用一个单独的函数,它首先将我的数据帧写入csv文件,然后调用bcp批量加载器。在我的情况下,这比sqlSave快得多。
答案 2 :(得分:1)
在sendToDB()函数中有相对较大的开销。该函数必须协商ODBC连接,发送单行数据,然后关闭列表中每个项目的连接。如果使用rodbc,使用sqlSave()将整个数据帧作为表复制会更有效。根据我的经验,我发现一些数据库(例如SQL Server)在潜在网络上使用sqlSave()仍然相当慢。在这些情况下,我从R导出为CSV并使用批量加载程序将文件加载到数据库中。我有一个外部脚本设置,我调用system()调用来运行批量加载器。这样负载发生在R之外但我的R脚本正在运行show。