有没有办法使用MonetDB.R进行批量插入(不是通过for循环和dbSendUpdate)?
dbWriteTable是否允许更新(append = TRUE)?
关于" INSERT INTO" MonetDB文档说明: "好处很明显:这非常简单。但是,这是在MonetDB中执行操作的一种非常低效的方式。"
感谢。
答案 0 :(得分:2)
Hannes可能有一个更聪明的解决方案,但目前,这可能有所帮助:)
# start with an example data set
nrow( mtcars )
# and a MonetDB.R connection
db
# here's how many records you'd have if you stack your example data three times
nrow( mtcars ) * 3
# write to three separate tables
dbWriteTable( db , 'mtcars1' , mtcars )
dbWriteTable( db , 'mtcars2' , mtcars )
dbWriteTable( db , 'mtcars3' , mtcars )
# stack them all
dbSendUpdate( db , "CREATE TABLE mtcars AS SELECT * FROM mtcars1 UNION ALL SELECT * FROM mtcars2 UNION ALL SELECT * FROM mtcars3 WITH DATA" )
# correct number of records
nrow( dbReadTable( db , 'mtcars' ) )
答案 1 :(得分:2)
我会考虑它。 monetdb.read.csv确实使用COPY INTO,因此您可能会创建一个temp。 CSV文件。
答案 2 :(得分:1)
我明白你的意思虽然这并没有改变dbWriteTable使用for循环和" INSERT INTO"这可能会很慢。我在最初的帖子中可能不是很清楚。
作为一种解决方法,我想" START TRANSACTION"和" COMMIT"使用dbSendUpdate可能会有效。
理想情况下,这样的事情会很棒:
" COPY INTO table FROM data.frame"
答案 3 :(得分:1)
我们刚刚在CRAN上发布了MonetDB.R的0.9.4版本。此版本中的主要更改是对dbWriteTable方法的重大改进。默认情况下,INSERT现在按每个语句分为1000行。此外,如果数据库与R在同一台计算机上运行,则可以使用csvdump = T参数。这会将data.frame写入本地临时CSV文件,并使用自动生成的COPY INTO语句进行导入。这两种方法显然都旨在提高dbWriteTable导入数据的速度。此外,他附加/覆盖参数处理已得到修复。