2016-12-15 11 views
0
earnings = self.collection.find({}) #return 60k documents 
---- 
data_dic = {'score': [], "reading_time": [] } 
for earning in earnings: 
    data_dic['reading_time'].append(earning["reading_time"]) 
    data_dic['score'].append(earning["score"]) 
---- 
df = pd.DataFrame() 
df['reading_time'] = data_dic["reading_time"] 
df['score'] = data_dic["score"] 

コード間の完了には4秒かかります。この機能をどのように改善できますか?mongodbからのデータ取得のパフォーマンスを向上させよう

+0

各リストをdata_dicに事前に割り当て、リストに常に追加するのではなく、特定のインデックスで要素を単に変更することも可能です。また、複数のコアを利用する場合は、マルチスレッドを導入することもできます。 –

+0

try [MongoDB aggregation](https://docs.mongodb.com/manual/aggregation/) – Valijon

答えて

4

時刻は、Mongodbのクエリ時間、データの転送に使用された時間、ネットワークのラウンドトリップ、Pythonリストの操作で構成されます。それぞれを最適化することができます。

1つは転送するデータ量を減らすことです。あなたはreading_timescoreしか必要ないので、それらを取り出すことができます。平均的な文書サイズが大きい場合、このアプローチは非常に効果的です。

earnings = self.collection.find({}, {'reading_time': True, 'score': True}) 

秒。 Mongoは限られた量のデータを一括して転送します。データには最大60k行が含まれ、データの転送には複数回かかります。往復回数を減らすようにcursor.batchSizeを調整できます。

第3に、可能であればネットワーク帯域を増やしてください。

第4位。あなたはnumpy arrayを利用して加速することができます。これはPythonのリストよりも速いCのような配列データ構造です。固定長配列を事前に割り当て、インデックスで値を代入します。これにより、list.appendに電話する際の内部調整が回避されます。

count = earnings.count() 
score = np.empty((count,), dtype=float) 
reading_time = np.empty((count,), dtype='datetime64[us]') 
for i, earning in enumerate(earnings): 
    score[i] = earning["score"] 
    reading_time[i] = earning["reading_time"] 

df = pd.DataFrame() 
df['reading_time'] = reading_time 
df['score'] = score 
関連する問題