4

以下を使用して、mongodb から r にデータをインポートしようとしました。

mongo.find.all(mongo, namespace, query=query,
fields= list('_id'= 0, 'entityEventName'= 1, context= 1, 'startTime'=1 ), data.frame= T)

このコマンドは小さなデータ セットに対しては機能しますが、1,000,000 個のドキュメントをインポートしたいと考えています。

system.time を使用し、コマンドに limit= X を追加して、インポートするデータの関数として時間を測定します。

system.time(mongo.find.all(mongo, namespace, query=query ,
fields= list('_id'= 0, 'entityEventName'= 1, context= 1, 'startTime'=1 ),
limit= 10000, data.frame= T))

結果:

Data Size   Time
1           0.02
100         0.29
1000        2.51
5000        16.47
10000       20.41
50000       193.36
100000      743.74
200000      2828.33

データをプロットした後、私は次のことを信じています: インポート時間 = f( Data^2 )

時間 = -138.3643 + 0.0067807*データ サイズ + 6.773e-8*(データ サイズ-45762.6)^2

R^2 = 0.999997

  1. 私は正しいですか?
  2. もっと速いコマンドはありますか?

ありがとう!

4

1 に答える 1

3

lmクールですが、パワー3、4、5、...機能を追加しようとすると、素晴らしいR ^ 2も得られると思います=)オーバーフィット=)

vectorR の既知の欠点の 1 つは、 (または)に要素を効率的に追加できないことですlist。要素を追加すると、オブジェクト全体のコピーがトリガーされます。ここでは、この効果の派生物を見ることができます。一般に、mongodb からデータをフェッチする場合、結果のサイズは事前にわかりません。カーソルを反復処理し、結果のリストを拡大します。古いバージョンでは、上記の R の動作のために、この手順は信じられないほど遅かったです。この後、プルパフォーマンスが大幅に向上します。s を使用したトリックenvironmentは非常に役立ちますが、それでも事前割り当てリストほど高速ではありません。

しかし、もっとうまくやれる可能性はありますか? はい。

1) ユーザーが結果のサイズをポイントし、リストを事前に割り当てられるようにするだけです。limit=に渡された場合は自動的に実行されmongo.find.allます。この機能強化のために問題を埋めました。2) 結果をコード
で構築します。C

データのサイズが事前にわかっている場合は、次のことができます。

cursor <- mongo.find(mongo, namespace, query=query, fields= list('_id'= 0, 'entityEventName'= 1, context= 1, 'startTime'=1 ))
result_lst <- vector('list', NUMBER_OF_RECORDS)
i <- 1
while (mongo.cursor.next(cursor)) {
  result_lst[[i]] <- mongo.bson.to.list(mongo.cursor.value(cursor))
  i <- i + 1
}
result_dt <- data.table::rbindlist(result_lst)
于 2015-08-12T08:48:44.100 に答える