2016-04-29 14 views
2

このサイトのMonetDB.R/MonetDBLiteの投稿、CRAN PDF、MonetDBサイトのドキュメントのいくつかを読んで、表示されるものの底にあることを告白しました急な学習曲線になる1つの大きなテーブルまたは多数の小さなテーブル

MonetDBLiteのドキュメントには、実際には直接呼び出されないことが書かれている注意書きの機能がいくつか記載されています。 RでMonetDB.R関数を使用すると、MonetDB.R関数の使用が推奨されていないことを示す警告が表示され、MonetDBLiteの使用を検討してください。

私のデータセットは、現在rdsファイルに保存されている30個のdata.framesを占めている約1億行×60個のfactor列です。私はRの中でその全体を処理するのに十分なメモリがないので、MonetDBにすべてをダンプし、特定のタスクに必要なデータだけを抽出したいと思います。

Data.frameパラダイムごとに1つのテーブルを選択すると、どのRスクリプトがMonetDBデータベース内のすべてのテーブルでクエリを実行しますか?私はこれが何らかのタイプのJOINだと仮定します。これはCREATE VIEWで行うことができますか?

大きなテーブルパラダイムを選択すると、既存のMonetDBテーブルに追加できるRスクリプトは何ですか?

ガイダンスをいただければ幸いです。これまで私がこれまでにまとめてきたことは次のとおりです。

library(MonetDB.R) 
library(MonetDBLite) 
library(DBI) 
library(digest) 

dbDir <- 'myDirectory' 

# 
# Create connection to database 
# 
conn <- dbConnect(MonetDBLite(), dbDir) 

# 
# Get data.table 
# 
f <- choose.files(default='directory to rds files', 
         caption="select files for processing:", 
         multi=FALSE) 

dt <- readRDS(file=f) 

# extract file name without extension 
tblName <- sub("^([^.]*).*", "\\1", basename(f)) 

# 
# Add data.table to db 
# 
dbWriteTable(conn, tblName, dt) 

# 
# Count rows 
# 
qryStr <- paste("SELECT COUNT(*) FROM", tblName) 
dbGetQuery(conn, qryStr) 

# 
# After loading a few tables, stitch together into one view 
# 
viewStr <- "CREATE VIEW big_tbl AS 
      SELECT * FROM (
       SELECT 'table1' AS type, table1.* FROM table1 
       UNION ALL 
       SELECT 'table2' AS type, table2.* FROM table2 
       UNION ALL 
       SELECT 'table3' AS type, table3.* FROM table3 
      ) AS big_tbl_table" 

dbGetQuery(conn, viewStr) 

# dbListTables(conn) 
#[1] "big_tbl" "table1"   
#[3] "table2" "table3"  

# 
# Get VIEW into R 
# 
library(dplyr) 

mdb  <- src_monetdb(embedded=dbDir) 
bigView <- tbl(mdb, 'big_tbl') # Error: select is not a character vector 
bigView <- tbl(mdb, 'table1') 

# 
# Disconnect from db 
# 
dbDisconnect(conn) 
+0

すべての小さなテーブルは同じスキーマ/カラムを持っていますか?その場合、 'dbWriteTable()'と 'append'フラグを' TRUE'に設定して、それらをすべて一つの大きなテーブルに入れます。 –

+0

@Hannes - これはまさに私が前進するために必要だったものです。ありがとうございました! –

+0

@Hannes - 回答を作成した場合は解決済みとマークします。再度、感謝します。 –

答えて

3

すべての小さなテーブルは同じスキーマ/カラムを持っていますか?その場合、を使用して、すべてappendフラグをTRUEに設定して、それらをすべて1つの大きなテーブルに入れます。

+0

こんにちはHannes、すぐ後で質問:data.tablesの列を因子として残すか、それらをMonetDBに書き込む前に文字(3列)、整数(12列)、数値(43列)に変換しますか?変換された列で満たされたテストDBは、係数のみで満たされた同じDBよりも2倍近く大きくなります。 MonetDBテーブルにロードされると、ファクタ列はCLOBデータ型を取ります。これは、整数型と倍精度型よりも多くのバイトを必要とすると思われます。私は最も安全な方法をディスク上で可能な限り高い圧縮率で使用したいと考えています。 –

+0

挿入時に因子が変換されます。 –

関連する問題