2017-09-11 6 views
2

現在、私は100万以上のエントリ(つぶやき)の絶えず増え続けるデータベースを視覚化し、Pythonのいくつかのボトルネックにぶつかり、わかりません面。Pythonの大規模なMongoDBコレクションの高速クエリ

いくつかの詳細:

  1. データベースは、時間、およびテキストなど、私は上のクエリを実行していますすべてのフィールド、上のインデックスが作成されます。

  2. コレクションの各エントリには、およそ100個のネストされたフィールドを持つ、非常に大きく複雑な構造が含まれています。

  3. 視覚化は保存されたデータのほんの一部しか必要としないので、少数の列を投影しています。

  4. 照会されるフィールドは、String、float32/64、date、およびidの型です。

Mongoのシェル内の指定された日付範囲については、このデータを照会し、処理時間が許容を超えている、しかし、パイソン内で行われたクエリは、指数関数的に時間がかかります。私はこれがなぜ起こるのかをよく理解していると思いますが、私は解決策を見つけるために十分な知識がありません。

私はPyMongoとMonaryの両方を使用していますが、両方とも期待していません。

Python内の処理時間をMongoシェルの時間に近づける明確な解決策はありますか?アイデアの私は、MongoがPythonに移る前にクエリ結果を別のコレクションに保存し、Python/Pandasの代わりにJavascriptベースのソリューションを試すことを考えました。

Monaryを使用するこのクエリ(10秒間)は、2878行を返し、76秒かかる。

start_time = datetime.datetime.strptime('2017-09-09 00:00:00', '%Y-%m-%d 
    %H:%M:%S').replace(
     tzinfo=timeZone).astimezone(tz.tzutc()) 
    end_time = datetime.datetime.strptime('2017-09-09 00:10:00', '%Y-%m-%d 
    %H:%M:%S').replace(tzinfo=timeZone).astimezone(
     tz.tzutc()) 

    columns = ['created_at'] 
    type = ['date'] 

    arrays = mon.query(
      'streamingTwitterDB', 
      'streamingTwitterDB', 
      {'created_at': {'$gt': start_time, '$lte': end_time}}, 
      columns, 
      type 
     ) 

    df = numpy.matrix(arrays).transpose() 
    df = pd.DataFrame(df, columns=columns) 

mongoでは、私はほとんど瞬時に1時間以上クエリできます。

答えて

1

プロトタイプBSON-NumPy libraryをお試しください。これは、PyMongo(文書をNumPy配列の行に変換する前にdictsに変換する必要があります)、Monaryのオーバーヘッドを回避します(Monaryのオーバーヘッドはフィールド名に一致するn-squaredアルゴリズムにより大きな文書を遅くしますNumPy列)。問題がある場合はthe BSON-NumPy issue trackerにお知らせください。

+1

このモジュールはかなり有望です!タイミングを比較しましたか? – MaxU

+0

はい、それはより速いです。これは、PyMongo(文書をNumPy配列の行に変換する前にdictsに変換する必要があります)、Monaryのオーバーヘッドを回避します(Monaryのオーバーヘッドはフィールド名に一致するn-squaredアルゴリズムにより大きな文書を遅くしますNumPy列)。試してみて、それがあなたのためにどのように働くか教えてください! –

+0

このライブラリは、変換する前にコレクション内のフィールドをクエリできますか?私は、データが完全に投影または変換された例だけを見つけることができます。 –

関連する問題