私はrmongodbを使用して、特定のコレクション内のすべてのドキュメントを取得しています。それは動作しますが、私は何百万もの小さな文書を扱っています。潜在的に100M以上です。これは、結果の数百または数千のために正常に動作しますが、ループは非常に非常に遅いながらというrmongodbを使用して大きな結果セットを高速化
count <- mongo.count(mongo, ns, query)
cursor <- mongo.find(mongo, query)
name <- vector("character", count)
age <- vector("numeric", count)
i <- 1
while (mongo.cursor.next(cursor)) {
b <- mongo.cursor.value(cursor)
name[i] <- mongo.bson.value(b, "name")
age[i] <- mongo.bson.value(b, "age")
i <- i + 1
}
df <- as.data.frame(list(name=name, age=age))
をcnub.org/rmongodb.ashx:私は、ウェブサイト上の著者によって提案された方法を使用しています。これをスピードアップする方法はありますか?多分マルチプロセッシングの機会でしょうか?任意の提案をいただければ幸いです。私は1時間に1Mを平均しており、この速度ではデータフレームを構築するのに1週間しかかかりません。
編集: 私は、whileループのベクトルが多いほど遅くなることに気付きました。私は今、各ベクトルごとに別々にループしようとしています。しかし、まだハックのように思えますが、より良い方法が必要です。
編集2: 私はdata.tableで運が少しあります。 ITSは、まだ実行されているが、それはそれは進行中だが、はるかに理想的な
dt <- data.table(uri=rep("NA",count),
time=rep(0,count),
action=rep("NA",count),
bytes=rep(0,count),
dur=rep(0,count))
while (mongo.cursor.next(cursor)) {
b <- mongo.cursor.value(cursor)
set(dt, i, 1L, mongo.bson.value(b, "cache"))
set(dt, i, 2L, mongo.bson.value(b, "path"))
set(dt, i, 3L, mongo.bson.value(b, "time"))
set(dt, i, 4L, mongo.bson.value(b, "bytes"))
set(dt, i, 5L, mongo.bson.value(b, "elaps"))
}
私はプログラマーではありませんが、実際には使用したことはありませんが、コレクション全体を反復処理して検証を実行するのではなく、必要なデータの部分集合を選択するのはなぜですか?この場合、ただ1つではなく6つのカーソルをサーバー側のように送信する方が簡単です。 – Sammaye
?もちろん、whileループのベクトルが増えるほど遅くなります。もっとやるべきことがあります。だから時間がかかります。それとも非線形ですか?どのようにループしているものの数の異なる値で動作しますか?または、「より多くのベクトル」によって、年齢や名前などのより多くのものを意味するのでしょうか?定かでない。 – Spacedman
@Sammaye、まさに私が各ベクトルごとに別々にループすることを意味するものです。私はその昨夜、そのループにカウンタを入れて、それはちょうど死亡したように見えた、それは数時間後に印刷を停止しました。放棄はちょうどぶら下がっている。だからこの方法は役に立たなかった。 – rjb101