将大向量发送到R中的数据库

时间:2010-07-06 05:13:52

标签: optimization r

下午好,

在计算了一个相当大的向量(比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)然后处理循环内的数据要快得多。

3 个答案:

答案 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。