SQLiteデータベースからR data.tableにテーブル(1000000行、10列)を読み取るこの単純なRプログラムがあり、データに対していくつかの操作を行い、同じsqliteの新しいテーブルに書き戻そうとしますデータベース。データの読み取りには数秒かかりますが、テーブルを sqlite データベースに書き戻すには数時間かかります。まだ終わっていないので正確な時間はわかりませんが、私が試した最長は 8 時間です。
これは、プログラムの簡略化されたバージョンです。
library(DBI)
library(RSQLite)
library(data.table)
driver = dbDriver("SQLite")
con = dbConnect(driver, dbname = "C:/Database/DB.db")
DB <- data.table(dbGetQuery(con, "SELECT * from Table1"))
dbSendQuery(con, "DROP TABLE IF EXISTS Table2")
dbWriteTable(con, "Table2", DB)
dbDisconnect(con)
dbUnloadDriver(driver)
Rバージョン2.15.2を使用しています。パッケージバージョンは次のとおりです。
data.table_1.8.6 RSQLite_0.11.2 DBI_0.2-5
複数のシステムとさまざまな Windows バージョンで試してみましたが、いずれの場合も、このテーブルを sqlite データベースに書き込むには信じられないほどの時間がかかります。sqlite データベースのファイル サイズを見ると、毎分約 50KB の書き込みが行われています。
私の質問は、この遅い書き込み速度の原因を知っている人はいますか?
ティムには答えがありましたが、コメントにあるため、そのようにフラグを立てることはできません。
のように: dbWriteTable を使用して R データ テーブルを SQLite データベース内に保存するときにメモリ制限に達するのを回避するためのアイデア データベース にデータをチャンクで書き込みました
chunks <- 100
starts.stops <- floor( seq( 1 , nrow( DB ) , length.out = chunks ) )
system.time({
for ( i in 2:( length( starts.stops ) ) ){
if ( i == 2 ){
rows.to.add <- ( starts.stops[ i - 1 ] ):( starts.stops[ i ] )
} else {
rows.to.add <- ( starts.stops[ i - 1 ] + 1 ):( starts.stops[ i ] )
}
dbWriteTable( con , 'Table2' , DB[ rows.to.add , ] , append = TRUE )
}
})
それはとります:
user system elapsed
4.49 9.90 214.26
データベースへのデータの書き込みが完了するまでの時間。どうやら私はそれを知らずにメモリ制限に達していたようです。