4

すべての列を常に格納し、それらを使用して計算するのに十分な RAM がなかったため、RSQLite を使用して RSQLite と組み合わせて R を使用してデータを永続化しています。以下を使用して、空の列を SQLite データベースに追加しました。

dbGetQuery(db, "alter table test_table add column newcol real)

ここで、R で計算し、data.table 列 dtab$newcol に格納されているデータを使用して、この列を埋めたいと思います。私は次のアプローチを試しました:

dbGetQuery(db, "update test_table set newcol = ? where id = ?", bind.data = data.frame(transactions$sum_year, transactions$id))

残念ながら、R は何かを行っているように見えますが、CPU 時間や RAM 割り当てを使用していません。データベースのサイズは変化せず、24 時間経過しても何も変化していません。したがって、出力なしでクラッシュしたと思います。

updateステートメントを間違って使用していますか? これを行う別の方法はありますか?

アップデート

RSQLite 関数 dbSendQuery と dbGetPreparedQuery も試しましたが、どちらも同じ結果でした。ただし、bind.data を使用せずに単一の行を更新することは機能します。したがって、列を更新するループは可能と思われますが、データセットが巨大であるため、パフォーマンスを評価する必要があります。

4

1 に答える 1

2

@jangorecki が述べたように、問題は SQLite のパフォーマンスに関係していました。同期を無効にし、journal_mode を off に設定しました (これはセッションごとに行う必要があります)。

dbGetQuery(transDB, "PRAGMA synchronous = OFF") 
dbGetQuery(transDB, "PRAGMA journal_mode = OFF")

また、RSQLite コードをdbBegin()dbSendPreparedQuery()およびを使用するように変更しdbCommit()ました。しばらく時間がかかりますが、少なくとも機能せず、許容できるパフォーマンスがあります。

于 2015-07-20T21:03:37.080 に答える