Объемная вставка MonetDB.R

Есть ли способ сделать массовую вставку с помощью MonetDB.R (не через цикл for и dbSendUpdate)?

Разрешает ли dbWriteTable обновления (append=TRUE)?

О «INSERT INTO» в документации MonetDB говорится: «Преимущество очевидно: это очень просто. Однако это очень неэффективный способ работы в MonetDB».

Спасибо.


person Bart Lenoir    schedule 11.07.2014    source источник
comment
Ханнес только что отправил 0.9.4 в CRAN -- теперь append=TRUE работает :) ура!   -  person Anthony Damico    schedule 18.07.2014
comment
Блестяще!! COPY INTO (через csvdump=TRUE) всегда быстрее, чем INSERT INTO. Большое спасибо за эту дополнительную функцию! Однако однажды у меня возникла проблема: MonetDB, похоже, не принимает BOOLEAN из CSV-файла, сгенерированного write.table (с csvdump, установленным в TRUE); есть ли способ заставить write.table использовать 1 и 0 вместо TRUE и FALSE?   -  person Bart Lenoir    schedule 21.07.2014
comment
Не могли бы вы открыть отдельный вопрос SO и привести небольшой воспроизводимый пример? :)   -  person Anthony Damico    schedule 21.07.2014
comment
Только что был выпущен MonetDB Jan2014-SP3, в котором исправлена ​​проблема импорта BOOLEAN при использовании csvdump=T.   -  person Hannes Mühleisen    schedule 31.07.2014
comment
привет, MonetDBLite (в CRAN) теперь заменяет MonetDB.R и работает как встроенный (как RSQLite). подробнее см. github.com/hannesmuehleisen/MonetDBLite/blob/master/README. .мд   -  person Anthony Damico    schedule 18.06.2016


Ответы (4)


У Ханнеса может быть более разумное решение, но пока это может помочь :)

# 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' ) )
person Anthony Damico    schedule 11.07.2014

Я рассмотрю это. monetdb.read.csv использует COPY INTO, поэтому вам может сойти с рук создание временного файла. CSV-файл.

person Hannes Mühleisen    schedule 14.07.2014

Я понимаю, что вы имеете в виду, хотя это ничего не меняет в том факте, что dbWriteTable использует цикл for и «INSERT INTO», что может быть довольно медленным. Я, возможно, не очень ясно выразился в своем первоначальном посте.

В качестве обходного пути я предполагаю, что "START TRANSACTION" и "COMMIT" с dbSendUpdate могут работать.

В идеале было бы здорово что-то вроде этого:

"КОПИРОВАТЬ В таблицу ИЗ data.frame"

person Bart Lenoir    schedule 12.07.2014
comment
Скоро (надеюсь, завтра) мы выпустим новую версию коннектора, которая должна решить эту проблему. - person Hannes Mühleisen; 14.07.2014
comment
Я видел код только из версии 0.4: r-forge.r-project.org/scm/viewvc.php/pkg/MonetDB.R/ В этой версии транзакции (добавленные в v0.9) еще не были доступны. Поскольку вы будете работать над коннектором, можно ли будет добавить append=TRUE в dbWriteTable? Благодарю вас! - person Bart Lenoir; 14.07.2014

Мы только что опубликовали версию 0.9.4 MonetDB.R на CRAN. Основным изменением в этом выпуске являются значительные улучшения метода dbWriteTable. По умолчанию INSERT теперь разбит на 1000 строк на оператор. Кроме того, если база данных работает на том же компьютере, что и R, вы можете использовать параметр csvdump=T. Это записывает data.frame в локальный временный файл CSV и использует автоматически сгенерированный оператор COPY INTO для импорта. Оба эти метода, очевидно, предназначены для повышения скорости, с которой dbWriteTable импортирует данные. Кроме того, исправлена ​​обработка параметров добавления/перезаписи.

person Hannes Mühleisen    schedule 23.07.2014