MonetDB.R批量插入

时间:2014-07-11 09:42:21

标签: r monetdb

有没有办法使用MonetDB.R进行批量插入(不是通过for循环和dbSendUpdate)?

dbWriteTable是否允许更新(append = TRUE)?

关于" INSERT INTO" MonetDB文档说明: "好处很明显:这非常简单。但是,这是在MonetDB中执行操作的一种非常低效的方式。"

感谢。

4 个答案:

答案 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导入数据的速度。此外,他附加/覆盖参数处理已得到修复。

相关问题