rmongodb を使用して、特定のコレクション内のすべてのドキュメントを取得しています。それは機能しますが、私は何百万もの小さなドキュメント、潜在的には 1 億以上のドキュメントを扱っています。私はウェブサイトで著者が提案した方法を使用しています: cnub.org/rmongodb.ashx
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))
これは、数百または数千の結果に対しては問題なく機能しますが、while ループは非常に低速です。これをスピードアップする方法はありますか?おそらくマルチプロセッシングの機会ですか?任意の提案をいただければ幸いです。1 時間あたり平均 100 万で、このレートでは、データ フレームを構築するだけで 1 週間かかります。
編集: while ループ内のベクトルが多いほど、処理が遅くなることに気付きました。私は今、ベクトルごとに別々にループしようとしています。まだハックのように思えますが、もっと良い方法があるはずです。
編集 2: data.table でうまくいきました。まだ実行中ですが、12M (これは私の現在のテスト セットです) を 4 時間で終了するようです。これは進歩ですが、理想からはほど遠いものです
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"))
}