3

大規模なデータベース (〜 100Gb) があり、そこからすべてのエントリを取得し、比較を実行して、それらの比較の結果を保存する必要があります。単一の R セッション内で並列クエリを実行しようとしましたが、成功しませんでした。一度に複数の R セッションを実行できますが、より良いアプローチを探しています。これが私が試みたものです:

library(RSQLite)
library(data.table)
library(foreach)
library(doMC)



#---------
# SETUP
#---------


#connect to db
db <- dbConnect(SQLite(), dbname="genes_drug_combos.sqlite")


#---------
# QUERY
#---------
# 856086 combos = 1309 * 109 * 6

registerDoMC(8)

#I would run 6 seperate R sessions (one for each i)
res_list <- foreach(i=1:6) %dopar% {

  a <- i*109-108
  b <- i*109

  pb  <- txtProgressBar(min=a, max=b, style=3)
  res <- list()

  for (j in a:b) {

    #get preds for drug combos
    statement   <- paste("SELECT * from combo_tstats WHERE rowid BETWEEN", (j*1309)-1308, "AND", j*1309)
    combo_preds <- dbGetQuery(db, statement)

    #here I do some stuff to the result returned from the query
    combo_names <- combo_preds$drug_combo
    combo_preds <- as.data.frame(t(combo_preds[,-1]))

    colnames(combo_preds)  <- combo_names

    #get top drug combos
    top_combos <- get_top_drugs(query_genes, drug_info=combo_preds, es=T)

    #update progress and store result
    setTxtProgressBar(pb, j)
    res[[ length(res)+1 ]] <- top_combos
  }
  #bind results together
  res <- rbindlist(res)
}

エラーは発生しませんが、1 つのコアのみがスピンアップします。対照的に、複数の R セッションを実行すると、すべてのコアが使用されます。私は何を間違っていますか?

4

1 に答える 1

4

RSQLite同じファイルの SQLite データベースに同時にアクセスしているときに学んだこと:

1. 各ワーカーに独自の DB 接続があることを確認します。

  parallel::clusterEvalQ(cl = cl, {
    db.conn <- RSQLite::dbConnect(RSQLite::SQLite(), "./export/models.sqlite");
    RSQLite::dbClearResult(RSQLite::dbSendQuery(db.conn, "PRAGMA busy_timeout=5000;"));
  })

2.使用PRAGMA busy_timeout=5000;

デフォルトではこれは 0 に設定されており、DB がロックされている間に Worker が DB に書き込もうとするたびに、「 database is locked 」エラーが発生する可能性があります。前のコードはPRAGMA、各ワーカー接続でこれを設定します。SELECT操作は決してロックされないことに注意してくださいINSERT/DELETE/UPDATE

3.使用PRAGMA journal_mode=WAL;

これは一度だけ設定する必要があり、デフォルトで永久にオンのままです。2 つの (多かれ少なかれ永続的な) ファイルが DB に追加されます。同時読み取り/書き込みパフォーマンスが向上します。詳細はこちらをご覧ください

上記の設定では、この問題は発生していません。

于 2017-06-08T20:30:09.417 に答える