6

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"))

}

4

2 に答える 2

3

mongo.find.exhaustオプションを試してみるのもいいかもしれません

cursor <- mongo.find(mongo, query, options=[mongo.find.exhaust])

ユースケースで実際に機能する場合、これが最も簡単な修正です。

ただし、rmongodb ドライバーには、他のドライバーで利用できるいくつかの追加機能が欠けているようです。たとえば、JavaScript ドライバーにはCursor.toArrayメソッドがあります。すべての検索結果を配列に直接ダンプします。R ドライバーにはmongo.bson.to.list関数がありますが、mongo.cursor.to.listおそらく必要なものは a です。おそらく、ドライバーの開発者にアドバイスを求める価値があります。

ハッキーな解決策は、ドキュメントがそれぞれ元のドキュメントの 100000 のデータ「チャンク」である新しいコレクションを作成することです。次に、これらのそれぞれを で効率的に読み取ることができますmongo.bson.to.list。チャンク コレクションは、mongo サーバーの MapReduce 機能を使用して構築できます。

于 2012-12-20T19:08:12.420 に答える
1

一般的な方法でこれを行うためのより速い方法はありません。外国のアプリケーションからデータをインポートし、解釈された言語で作業していますが、rmongodb がコレクション内のドキュメントの構造を予測する方法がありません。何千ものドキュメントを扱う場合、プロセスは本質的に遅くなります。

于 2012-12-20T21:46:52.797 に答える