optimization - 将巨大的矢量发送到 R 中的数据库

标签 optimization r

下午好

在计算出一个相当大的向量(比 2^20 个元素短一点)后,我必须将结果存储在数据库中。

脚本执行大约需要 4 个小时,使用简单的代码,例如:

#Do the processing
myVector<-processData(myData)
#Sends every thing to the database
lapply(myVector,sendToDB)

您认为最有效的方法是什么?

我考虑过使用相同的查询来插入多条记录(多次插入),但它只是返回到“夹持”数据。

是否有任何矢量化函数可以将其发送到数据库中?

有趣的是,代码在开始处理向量的第一个元素之前花费了大量时间。也就是说,如果我在 sendToDB 中放置一个 browser() 调用,它需要 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) 然后在循环内处理数据要快得多。

最佳答案

将它写入某个文件并调用 LOAD DATA INFILE 怎么样?这至少应该给出一个基准。顺便说一句:您使用哪种 DBMS?

关于optimization - 将巨大的矢量发送到 R 中的数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3183639/

相关文章:

c# - 在期望运行重复值时压缩列表,同时保持索引查找

r - 如何删除唯一条目并在R中保留重复项

r - 为什么 R 使用系统 tar,而不是 Rtools tar?

python - 自定义均值实现比 pandas 默认均值慢。如何优化?

r - 将元素列表上的行绑定(bind)到 data.frame 列表

r - 自定义字符串填充

r - 在 R 中以日期作为列类预分配数据框

javascript - 需要优化的解决方案,并且不使用 jquery 函数

c++ - 当涉及到 C++ 中的函数内联时,谁来负责写入数字?

Javascript 模块模式内存占用和性能